面向对象编程 - 最佳实践?

时间:2011-04-23 02:18:36

标签: object oop

您会选择以下哪项? 基于面向对象的编程哪一个是最佳实践?

A

Class Note
{
    //Some properties, etc
    public static Note getNoteFromServer();
    public void UpdateNoteOnServer();
}

Class Note
{
    //Some properties, etc
}

Class NoteManager
{
    public static Note getNoteFromServer();
    public static UpdateNoteOnServer(Note);
}

10 个答案:

答案 0 :(得分:4)

我会说选项B.通过这种方式你可以分开关注:你有一个Note可以在任何地方重复使用(而不一定是在网络应用程序上),你有一个只关心服务器的经理类通信。

您也可以考虑多个服务器的实现逻辑。例如,您可能希望与JSON或XML等数据格式进行通信。您可以实现一个接口(例如,接口INoteManager),然后为我提到的每种数据类型实现两个带有服务器的类(例如,NoteManagerXmlNoteManagerJson)。

这个问题的主要观点是分离关注点。希望我帮了! :)

答案 1 :(得分:3)

要从我的其他答案中采取不同的观点,我建议您对Note / NoteManager的划分是错误的 - 不是因为Note有任何问题,但是因为术语经理有点像代码气味因为它非常通用,所以邀请将该类用作一般倾销场。

如果班级负责音符持久性,请将其命名为NoteRepository

如果它负责验证单个笔记的内容,请将逻辑移到Note

如果它负责创建笔记,提供一些方便的方法来轻松创建笔记,请将其命名为NoteFactory

如果它对上述所有内容负责,请将其拆分为单独的部分,因为它做得太多了。

答案 2 :(得分:1)

这是一个非常基于意见的问题,你在那里问。

你实际上是在询问(如果我理解的话)是否更好地拥有一个只包含属性的类和另一个用于管理该对象的类(例B)或者拥有一个完成所有操作的类(例A)。

这取决于。如果我们计划使用MVC类型的框架,那么示例B将更适合,Note是您的Model,而NoteManager是控制器。

就个人而言,我会使用A和B的混合,其中NoteManager正在处理控制器操作,但模型仍然有自己的方法来管理单例实例。也许是这样的?

Class Note
{
    //Some properties, etc
    public static Note getInstance(noteIdentifier);

    public void saveNote();
}

Class NoteManager
{
    // This handles view validation and calls Note.saveNote();
    public static UpdateNoteOnServer(Note);
}

答案 3 :(得分:1)

我认为A更好,原因有以下几点:

  

它实现了面向对象   这封信的范例。

我在B中看到的问题是,接收同一个类的实例的静态方法对我来说听起来多余,因为为什么要使用静态方法将行为应用于同一个类的实例?类和实例背后的整个想法是,类是框架和实例cookie,如果你需要不同的cookie,修改你的框架并获得新的框架。

答案 4 :(得分:1)

这似乎取决于它将如何在您的程序中使用。如果Note是唯一的类或者是派生类的父类,则没有任何意义并且拥有“管理器”,即保持简单愚蠢(KISS)。但是,如果Manager必须通过Interfaces处理其他类,那么我可以看到有一个单独的类。

答案 5 :(得分:0)

我会选择“B” 原因是您可能需要将“Note”与其他类型的Controller类一起使用,就像您为NoteManager所做的那样。 还使您能够将数据对象或DTO或模型与实际控制器类分开。

答案 6 :(得分:0)

根据我的经验,最佳实践是,只要事情分开,DRY就是最佳实践。你可以将注释扩展到notemanager

Class Note
{
    //Some properties, etc
}

Class NoteManager 
{
    public static Note getNoteFromServer();
    public static UpdateNoteOnServer(Note);
}

答案 7 :(得分:0)

我会选择 B ,除非你想最终像穷人一样'PHP:

get_note_from_server_and_print_the_response($note, 'PHP, why must you be so disorganized?')

但严重的是,目前执行 A 似乎很直观,但最终会将 A 分开,因为这些服务器操作需要越来越多的相关内容函数,直到你有一个庞大的Note类,其中包含程序中的每个函数......

答案 8 :(得分:0)

“它取决于”

它依赖的一个方面是实施语言。

如果您使用的是C#或Java,那么您可能希望采用Note / NoteManager方法,因为这为您提供了最灵活的实施 - 因为static这些语言的成员是一种二等公民。

为了说明,在Delphi的原始Object Pascal语言中,可以在没有实例的情况下访问的方法和属性称为class成员,而不是static成员,它们可以是virtual ,因此在后代课程中被覆盖。

如果您正在使用提供“虚拟类(静态)成员”等功能的语言,那么您可能希望将Note/NoteManager合并在一起。

答案 9 :(得分:0)

<强> C

Class Note
{
    //Some properties, etc
    public static Note LoadFrom(Whatever);
    public void SaveTo(Whatever);
}