存储库中的嵌套类和业务逻辑?

时间:2010-02-18 22:14:36

标签: c# class-design

对于我的应用程序,我需要将一些数据存储在包含属性(string mainstring[] status,i nt curParCount等)的数组中。

我目前正在将它存储在这个类中:

class Repository
{
    public static Rep[] rep = new Rep[6];
    public struct Rep
    {
        public string main;
        public string clean;
        public int curParCount;
        public int totalCount;
        public int parStart;
        public int partialStart;
        public double scrollPos;
        public int selectionStart;
        public int selectionEnd;
        public string[] status;
    }    
    public static string repName()
    {
        string name;
        if (MainWindow.repnum == 0)
        { name = "Main Text"; }
        else { name = "Repository " + MainWindow.repnum; }
        return name;
    }
    public static string getStatus(int repNum, int statNum)
    {
        return rep[repNum].status[statNum];
    }                                                                  
 }

这是我这样做的正确方法吗?肯定不会有这种感觉。

5 个答案:

答案 0 :(得分:6)

基本想法很好。实施可以改进。特别是,我担心你有一个可变结构;要么使它不可变,要么把它变成一个类。我还建议使用自动支持字段将公共字段更改为公共属性(然后将名称替换为大写字母)。

修改

这是我的版本:

class Repository
{
    public class Rep
    {
        public string Main {get; set;}
        public string Clean {get; set;}
        public int CurParCount {get; set;}
        public int TotalCount {get; set;}
        public int ParStart {get; set;}
        public int PartialStart {get; set;}
        public double ScrollPos {get; set;}
        public int SelectionStart {get; set;}
        public int SelectionEnd {get; set;}
        public string[] Statuses {get; set;}
    }                                       


    public const int StatusCount = 6;
    public static List<Rep> Reps = new List<Rep>();

    public static string Name
    {
        get
        { 
            if (MainWindow.repnum == 0)
              return "Main Text";

            return "Repository " + MainWindow.repnum;
        }
    }

    public static string GetStatus(int repIndex, int statIndex)
    { return Reps[repIndex].Status[statIndex]; }
}

答案 1 :(得分:3)

嗯, 的方式会这样做......

Public Class Repository: ObservableCollection<RepositoryItem>
{
}


public class RepositoryItem
    {
        public string main {get; set};
        public string clean {get; set};
        public int curParCount {get; set};
        public int totalCount {get; set};
        public int parStart {get; set};
        public int partialStart {get; set};
        public double scrollPos {get; set};
        public int selectionStart {get; set};
        public int selectionEnd {get; set};
        public string[] status {get; };
    }     

基本上,这是一个RepositoryItem类(它保存您的数据,以及您可能需要用于IMPACT数据的任何函数),然后是继承ObservableCollection类的类Repository,将其键入RepositoryItem。 / p>

答案 2 :(得分:2)

ParStart和PartialStart听起来像是一回事。您应该重命名其中一个字段,以使名称更具描述性。另外,如果Par是缩写,则不要缩写。你通常应该避免使用缩写(但如果众所周知,首字母缩略词是可以的)。如果这是缩写,那么“Rep”也是如此。

此外,我同意史蒂文的所有笔记。

答案 3 :(得分:1)

    class RepositoryManager
    {
        private static List<Repository> Repo { get; set; }
        .
        .
        .
    }

    public class Repository          
    {
            public string Main { get; set; }
            public string Clean { get; set; }
            public int CurParCount { get; set; }
            .
            .
    }                                           

答案 4 :(得分:0)

为了遵循最佳实践,我会改变一些事情。

首先,我会解决您所遇到的separation of concerns问题。 Rep结构不需要是嵌套类,在我看来,我会删除它,就像这样(并且还称之为其他):

class Repository 
{ 
    public static Rep[] rep = new Rep[6]; 
}

public struct RepositoryItem
{
    public string main; 
    public string clean; 
    public int curParCount; 
    public int totalCount; 
    public int parStart; 
    public int partialStart; 
    public double scrollPos; 
    public int selectionStart; 
    public int selectionEnd; 
    public string[] status; 
}

现在,如果你看一下,你有一个Repository类除了保存数组之外什么都不做。既然如此,您可以有效地消除它并将数组创建为变量并将其存储在您希望的任何位置。

留下RepositoryItem结构。我首先要解决违反design guidelines for class libraries的问题。这里最大的攻击是命名字段,它们应该是Pascal-cased

public struct RepositoryItem
{
    public string Main; 
    public string Clean; 
    public int CurParCount; 
    public int TotalCount; 
    public int ParStart; 
    public int PartialStart; 
    public double ScrollPos; 
    public int SelectionStart; 
    public int SelectionEnd; 
    public string[] Status; 
}

您还应该为您的字段名称提供更多有意义的名称。虽然“Pos”对您来说可能是显而易见的,但对其他人来说可能并不明显。 “ScrollPosition”可能是比“ScrollPos”更好的名称。

现在,除此之外,它会变得更加主观。你要问的问题是,这应该是一个结构(如果你想要按值复制语义,那么它应该是伟大的,或者是一个类)?此外,如果字段是只读的(如果是这样,这应该是一个类,你应该有一个获取所有值的构造函数)?

另外,如果属性/字段是只读的,请考虑其含义。如果Status字段是只读的,请考虑将其公开为IEnumerable而不是数组,因为它将为您分配值提供更大的灵活性,而不是强制数组所需的连续内存(同样,您将防止设置元素)在数组中,因为对数组的引用是只读的,而不是数组本身的元素。)