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

本文关键字:静态函数 返回 实例 对象 OOP | 更新日期: 2023-09-27 18:34:33

我有一个代表人的数据库表。 我正在编写一个将使用此类的 Web 服务,我不想每次都得到所有人。 这是"正确"的方法吗? 是否有某种接近于此的设计模式?

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

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);
        }
    }
}

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

在这种情况下,我会放弃该方法。它不做任何用户自己做不到的事情,而使用起来不直观。拥有构造函数是正常的操作行为。

一般来说,如果此函数执行在构造函数中无法完成的操作,则这可能是要使用的模式。

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

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
    }
}

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

另一种非常常见的方法是存储库模式。在此示例中,您将拥有一个 PersonRepository 类,该类旨在 Get ''UPDATE Person 类的实例。 存储库模式示例。您的存储库与数据库交互并提供 Person 的实例。靠近 UI 的代码无需担心任何实体框架''数据访问逻辑。您的 UI 只是从存储库中请求 Person 对象并显示它们。这证明了良好的关注点分离,可以保持代码干净并有助于将来的维护。