获取自定义对象列表的正确的面向对象方式是什么



假设我在一个外部类中有一个用户对象。然后我想获取所有用户。

我在其他地方读到过应该避免使用静态方法。因此应该避免调用类似CCD_ 1的东西。

因此,最好的做法是进行吗

User u = new User();
List<User> usrs = u.GetAllUsers();

为了调用一个全新的对象列表,必须创建一个新对象并将其放入内存,这似乎很愚蠢。

通常你会有一个类似UserRepository的东西,它管理你的User对象,并负责添加、删除、搜索等你的用户。

从那里你会得到一个用户列表。类似于:

class UserRepository
{
    // if you don't want to expose properties but only access them via method calls...
    private List<User> Users { get; }
    public UserRepository()
    {
        // get Users from Database or any other source...
        Users = db.Users;
    }
    public List<User> GetAllUsers()
    {
        return Users;
    }
    public void AddUser(User u)
    {
        Users.Add(u);
    }
}

在你的应用程序中,你会做这样的事情:

var userRep = new UserRepository();
var users = userRep.GetAllUsers();

如果您只有一个静态类,那么您可能会争论将存储库设置为静态类。

默认情况下绝对没有理由避免静态方法。它们的目的是公开可以自己操作的方法,而不需要来自同一逻辑类的任何其他对象数据。

微软经常使用静态方法,例如在系统中。数学命名空间:https://msdn.microsoft.com/en-us/library/system.math.aspx

在您的示例中,如果将来不打算向该用户集合添加额外的字段或方法,则可以将GetAllUsers()设置为静态。如果您确实想要这样做,那么最好创建一个代表用户列表的UserCollection类。

   public class UserCollection : Collection<User>
    {
        public IEnumerable GetAll()
        {
            return this.AsEnumerable();
        }
        public void MyFutureMethod()
        {
            //something you might want to do later on :-)
        }
    }

我在其他地方读到过应该避免使用静态方法。

静态方法本身并不坏。有许多有效的用例,例如数学辅助函数或静态工厂。

但是,有状态静态方法可能会有问题。这些本质上只是全局变量或伪装的单变量–以及所有相关的问题。它们也很难测试。

最新更新