您会选择以下哪项? 基于面向对象的编程哪一个是最佳实践?
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);
}
答案 0 :(得分:4)
我会说选项B.通过这种方式你可以分开关注:你有一个Note
可以在任何地方重复使用(而不一定是在网络应用程序上),你有一个只关心服务器的经理类通信。
您也可以考虑多个服务器的实现逻辑。例如,您可能希望与JSON或XML等数据格式进行通信。您可以实现一个接口(例如,接口INoteManager
),然后为我提到的每种数据类型实现两个带有服务器的类(例如,NoteManagerXml
和NoteManagerJson
)。
这个问题的主要观点是分离关注点。希望我帮了! :)
答案 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);
}