首页 新闻 会员 周边 捐助

关于面向对象的简单问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-04-20 09:27

有一个用户类,我是这么写的

public class User
    {
        private string userId;
        private string userName;
        private string password;
        private string[] powers;

        public string UserId
        {
            get { return userId; }
            set { userId = value; }
        }
        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }
        public string Password
        {
            get { return password; }
            set { password = value; }
        }
        public string[] Powers
        {
            get { return powers; }
            set { powers = value; }
        }

        public void Load() { }
        public void Save() { }
        public void Delete() { }
        public void HasPower() { }
    }

但发现了以下几个问题

1、无法从数据库初始化一个实例,Load方法是不是要写成静态的,还是要怎么做?

2、如果我要列出所有的用户,我不知道该放到哪个类里面?

现在脑子有点乱,想不清楚,谁能帮帮我啊!

andrew28的主页 andrew28 | 初学一级 | 园豆:79
提问于:2012-04-16 15:48
< >
分享
最佳答案
2

1. User只是一个数据模型,具体数据从哪儿来,怎么来(这些好像就是你要写到Load方法里的),跟模型没有关系。加载数据的实现应当由数据层其他代码完成。试想你在load里写了从数据库加载User对象,那么这个User模型就钉死了只能从数据库来,其他项目想从xml读取一个user,就不能复用你的user类,哪怕他们一模一样。

2. 为什么一定要放到某个类里呢。列出所有用户看起来是一个操作,那么它应当是某个方法的返回值。例如你有一个UserManager类,里面封装的是User的操作:

public List<User> ListAllUsers()
{
      //implementation
}
收获园豆:40
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-04-16 15:55

正解

会长 | 园豆:12463 (专家六级) | 2012-04-16 16:58

我有点搞不懂,不知道你们是怎么想的。

你们将实体看成是对象,这个我明白,但是你们是怎么看待获取实体列表(查找符合某条件的所有用户)这样的功能的呢,或者直接一点,如果是你,会怎样去设计?

andrew28 | 园豆:79 (初学一级) | 2012-04-16 19:05

@andrew28: 我回答了啊,有一个UserManager类,里面提供一些对User实体的操作,包括CRUD。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-04-17 00:25

@水牛刀刀: 大半夜来回复,真是太感动了,你的意思是我的User类仅仅包含属性和访问方法吗?不过还是有点困惑:如果包含了诸如Delete的方法,会有什么问题呢,或者是错误

我的User类仅仅包含属性和访问方法吗,

andrew28 | 园豆:79 (初学一级) | 2012-04-17 11:55

@andrew28: 模型可以设计成两种,一种是“贫血模型”,这类模型只包含数据(以及非常非常少的逻辑),如:

class User
{
      public long ID { get; set; }
      public string Name { get; set; }
      public string Address { get; set; }
}

你说的那种模型包含大量逻辑的,其实也可以(专业点ms叫“领域模型”我记不清楚了可能有误)。领域模型不适合做web开发,因为web是无状态的。推荐你一本书《Microsoft.NET企业级应用架构设计》(陈黎夫译),里面对此类设计讲的很透彻。一句话两句话很难说明白。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-04-17 12:01

@水牛刀刀: 领域模型不适合做web开发,因为web是无状态的。不敢苟同。把表现层和下面的层次分开来。

ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-17 15:21

@水牛刀刀: 如果是贫血模型,那就有点不太像是面向对象了,我觉得倒更像是“面向数据结构”了,但程序写起来确实比较清楚

andrew28 | 园豆:79 (初学一级) | 2012-04-17 15:21

@andrew28: 贫血跟面向对象不矛盾的。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-04-17 15:34

@andrew28: 逻辑也可以分为好几种,领域逻辑和具体的应用逻辑应该分开。面向对象的很大一个特点是一个类只做一件事,也就是说一个类只有一个引起变化的原因(SRP)。你如果没有领域逻辑,就不必强把其他逻辑加到领域中的类上面。

ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-17 15:44

@ChatinCode: 那领域逻辑与应用逻辑有什么区别呢?问得有点多了,呵呵--!

andrew28 | 园豆:79 (初学一级) | 2012-04-17 16:55

@andrew28: 具体还是看看面向对象设计的基础书吧,应用逻辑无法重用,而领域逻辑可以在针对同一领域的不同应用中重用。应用逻辑(具体是不是应该这么叫也不大清楚了)与领域类可以没有关系,而跟具体的Use Case有很大联系。一下子也想不到好的例子。

ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-20 10:33
其他回答(4)
0

把你的方法從實體中拿掉。在另一個地方初始化數據庫,然後填充 這個實體。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-16 16:09
0

使用三层架构的方式,你就不会感觉乱了,第一层中的方法都可以被上一层随意调用,这样就灵活多了。。。

KivenRo | 园豆:1734 (小虾三级) | 2012-04-16 17:25
0

1.初始化数据时,建议在构造函数各来实现,这样会比较方便,性能较佳;

2.若要列出所有用户,则可以使用List列表结合实体类User来实现,List<User> listUser=new List<User>();

--宁静以致远-- | 园豆:364 (菜鸟二级) | 2012-04-16 17:34
0

建议看看 <企业应用架构模式> 和 <Mircrosoft .net 企业级应用架构设计>,你这种设计应该是叫 Active Record模式吧。最后看看<领域驱动设计>

收获园豆:10
ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-17 15:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册