Oop 一种方法应该承担多少责任?

Oop 一种方法应该承担多少责任?,oop,Oop,这无疑是一个语言不可知的问题,也是困扰我很长一段时间的问题。举个例子也许能帮助我解释我所面临的困境: 假设我们有一个方法,负责读取一个文件,用一些对象(存储文件中的信息)填充一个集合,然后返回集合……如下所示: public List<SomeObject> loadConfiguration(String filename); 公共列表加载配置(字符串文件名); 我们还要说,在实现此方法时,如果返回的集合为空(大小为0),则应用程序似乎无法继续。现在的问题是,这个验证(检查一个

这无疑是一个语言不可知的问题,也是困扰我很长一段时间的问题。举个例子也许能帮助我解释我所面临的困境:

假设我们有一个方法,负责读取一个文件,用一些对象(存储文件中的信息)填充一个集合,然后返回集合……如下所示:

public List<SomeObject> loadConfiguration(String filename);
公共列表加载配置(字符串文件名);
我们还要说,在实现此方法时,如果返回的集合为空(大小为0),则应用程序似乎无法继续。现在的问题是,这个验证(检查一个空集合,也许随后抛出一个异常)是否应该在方法中完成?或者,这种方法的唯一责任是执行文件加载,而忽略验证任务,允许在方法之外的某个后期阶段进行验证吗

我想一般的问题是:将验证与方法执行的实际任务分离是否更好?一般来说,这会使事情在以后的阶段更容易更改或构建吗?在我上面的示例中,可能是在以后的阶段添加了不同的策略,以从“loadConfiguration”方法返回的空集合事件中恢复。。。。。如果验证(以及由此产生的异常)是在方法中进行的,那么这将很困难

也许我在寻求一些教条式的答案时过于迂腐,取而代之的是它仅仅依赖于使用方法的上下文。无论如何,我很想看看其他人对此有什么看法


谢谢大家

方法应该是高度内聚的。。。这是一心一意的。因此,我的意见是,按照您所描述的,将责任分开。有时我会忍不住想说……这只是一个简短的方法,所以没关系……然后我会在1.5周后后悔。

我认为这取决于具体情况:如果你能想到一个场景,你会使用这个方法,它返回一个空列表,这没关系,那么我就不会将验证放在这个方法中。但对于例如将数据插入必须验证的数据库的方法(电子邮件地址是否正确,是否指定了名称,…),则可以将验证代码放入函数中并引发异常

我想一般的问题是:是吗 最好将验证与测试分离 用户正在执行的实际任务 方法


是。(至少如果你真的坚持回答这样一个一般性的问题——找到反例总是很容易的。)如果你将解决方案的两个部分分开,你可以交换、删除或重用其中任何一个。这是一个明显的优点。当然,您必须小心,不要通过公开非验证API来破坏对象的不变量,但我想您已经意识到了这一点。你必须多打一些字,但这不会伤害你。

要把问题转向更基本的问题,每种方法都应该尽可能少地打。因此,在您的示例中,应该有一个读取文件的方法,一个从文件中提取必要数据的方法,另一个将数据写入集合的方法,以及另一个调用这些方法的方法。验证可以采用单独的方法,也可以采用其他方法之一,具体取决于最有意义的方法

   private byte[] ReadFile(string fileSpec)
   {  
       // code to read in file, and return contents
   }
   private FileData GetFileData(string fileContents)
   {
       // code to create FileData struct from file contents
   }
   private void FileDataCollection: Collection<FileData> { }

   public void DoItAll (string fileSpec, FileDataCollection filDtaCol)
   {
        filDtaCol.Add(GetFileData(ReadFile(fileSpec)));
   } 
private byte[]ReadFile(字符串fileSpec)
{  
//要在文件中读取并返回内容的代码
}
私有文件数据GetFileData(字符串文件内容)
{
//从文件内容创建FileData结构的代码
}
私有void FileDataCollection:集合{}
public void DoItAll(字符串fileSpec、FileDataCollection filDtaCol)
{
Add(GetFileData(ReadFile(fileSpec));
} 

在每种方法中添加适当的验证和验证

我的建议是坚持单一责任原则,简言之,即每个对象应有一个目的。在本例中,您的方法有3个目的,如果将验证方面计算在内,则有4个目的

下面是我关于如何处理此问题以及如何为将来的更新提供大量灵活性的建议

  • 保留LoadConfig方法

  • 让它调用一个新的方法来读取文件

  • 将前一个方法的返回值传递给另一个方法,以便将文件加载到集合中

  • 将对象集合传递到某个验证方法中

  • 归还收藏

  • 这就是最初使用1个方法,然后将其分解为4个,其中一个调用3个其他方法。这应该允许您在不影响其他人的情况下更改工件


    希望这有帮助

    我将用一个问题来回答你的问题:你想为你的方法的产品使用各种验证方法吗

    这与“构造函数”问题相同:在构造过程中引发异常或初始化void对象,然后调用“init”方法更好吗。。。你一定会在这里引起争论

    一般来说,我建议尽快执行验证:这就是所谓的验证,它主张尽快发现问题比延迟检测要好,因为诊断是即时的,而稍后您必须恢复整个流程

    如果您不确信,可以这样想:您真的想在每次加载文件时写3行吗?(加载、解析、验证)好吧,这违反了原则

    所以,去那里:

    • 编写带有验证的方法:它负责加载有效的配置(1)
    • 如果您需要一些参数化,请添加它