这是正确的OOP设计吗?静态函数返回对象的实例

时间:2014-12-17 16:04:12

标签: c# oop design-patterns

我有一个代表人的数据库表。我正在编写一个将使用这个课程的WebService,我不想每次都让所有人都参与进来。是正确的'怎么办呢?是否存在某种与此接近的设计模式?

这是我实际做的一个愚蠢的例子,每个属性中的所有setter都会保存到数据库中。

namespace Example
{
    class Person
    {
        private int _id;
        private string _name;
        private int _age;

        public int ID { get { return _id; } set { _id = value; } }
        public string Name { get { return _name; } set { _name = value; } }
        public int Age { get { return _age; } set { _age = value; } }

        private Person(int id)
        {
            _id = id;
            // Query database and set values
        }

        public static Person GetPersonByID(int id) {
            return new Person(id);
        }
    }
}

2 个答案:

答案 0 :(得分:5)

在这种情况下,我会废弃该方法。当用户不直观时,用户无法做任何事情。拥有构造函数是正常的操作行为。

一般来说,如果此函数执行无法在构造函数中完成

的操作,则可以成为一种模式。

就个人而言,我会从人类中删除所有逻辑。这是 一个人的班级工作。一个人可以 没有任何数据库。如果要从数据源加载人员,请创建一个数据源类,并让其中一个方法返回一个人。

class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

class DataSource
{
    public void Save(Person p)
    {
       // save person to database
    }

    public Person LoadById(int id)
    {
       // load person from database
    }
}

答案 1 :(得分:1)

你已经展示了一种可行的方法,但它正在将管道与对象本身混合在一起,这对于将对象传递和可维护性来说并不是很好。

另一种非常常见的方法是存储库模式。在这里你将有一个PersonRepository类,它被设计为Person类的GET \ UPDATE实例。 Repository Pattern example。您的存储库与数据库交互并提供Person的实例。更靠近UI的代码不需要担心任何Entity Framework \ Data访问逻辑。您只需从存储库中请求Person对象并显示它们。这表明关注点的良好分离可以保持代码清洁并有助于将来的维护。