1

记得在MS发布论坛示例应用程序时,应用程序的设计是这样的:

/Classes/User.cs /Classes/Post.cs ... /Users.cs /Posts.cs

所以类文件夹只有类,即属性和getter/setter。Users.cs、Post.cs 等具有访问数据访问层的实际方法,因此 Posts.cs 可能如下所示:

public class Posts
{
    public static Post GetPostByID(int postID)
    {
          SqlDataProvider dp = new SqlDataProvider();
          return dp.GetPostByID(postID);
    }
}

另一种更传统的方法是将 Posts.cs 中的所有方法也放入类定义(Post.cs)中。

将内容拆分为 2 个文件会使其更加程序化,不是吗?这不是破坏 OOP 规则,因为它将行为从类中取出并将其放入另一个类定义中吗?

4

6 回答 6

3

如果每个方法都只是直接对数据源的静态调用,那么“Posts”类实际上就是一个工厂。您当然可以将“Posts”中的静态方法放入“Post”类(这就是 CSLA 的工作方式),但它们仍然是工厂方法。

我会说“Posts”类的更现代和更准确的名称是“PostFactory”(假设它只有静态方法)。

我想我不一定会说这是一种“程序化”方法——这只是一个误导性的名称,您会假设在现代 OO 世界中,“Posts”对象将是有状态的,并提供操作和管理一组“发布”对象。

于 2008-09-12T01:17:43.550 回答
1

Well it depends where and how you define your separation of concerns. If you put the code to populate the Post in the Post class, then your Business Layer is interceded with Data Access Code, and vice versa.

To me it makes sense to do the data fetching and populating outside the actual domain object, and let the domain object be responsible for using the data.

于 2008-09-12T01:18:48.413 回答
0

你确定这些类不是部分类吗?在这种情况下,它们实际上不是两个类,只是一个跨多个文件分布的类,以提高可读性。

于 2008-09-12T01:10:16.237 回答
0

根据您的代码片段,Posts主要是一类静态辅助方法。Posts与Post不是同一个对象。而不是Posts,一个更好的名字可能是PostManagerPostHelper。如果你这样想,它可能会帮助你理解他们为什么以这种方式打破它。

于 2008-09-12T01:12:17.760 回答
0

这也是解耦(或松散耦合)应用程序的重要步骤。

于 2008-09-12T01:13:40.597 回答
0

什么是反 OOP 或支持 OOP 完全取决于软件的功能以及使其工作所需的条件。

于 2008-09-12T01:14:46.100 回答