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

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

最佳答案

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

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

就个人而言,我会从 person 类中删除所有逻辑。 成为一个人是类(class)的工作。一个人可以没有任何数据库。如果您想从数据源加载人员,请创建一个数据源类并使用其中一种方法返回人员。

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

关于c# - 这是正确的 OOP 设计吗?静态函数返回对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529757/

相关文章:

c# - 我应该使用什么模式来表达分层枚举?

c# - ServiceStack - 使用内置身份验证功能时访问请求 DTO?

c# - 无法从 SQL Server 发送电子邮件

c# - ServicePointManager.SecurityProtocol 不是 SecurityProtocolType.SystemDefault

java - 封装与数据隐藏?

java - 当 similarly if-else 增长时应该使用什么设计模式?

c# - 在 C# 中将 unicode 字符转换为单个十六进制值

c++ - 虚拟模板解决方法

vb.net - 考勤管理系统uml类图

java - 如何从现有动态代理获取 'proxied'对象