首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当公共方法依赖于同一类中的其他公共方法时,单独的责任?

当公共方法依赖于同一类中的其他公共方法时,单独的责任?
EN

Software Engineering用户
提问于 2020-12-04 10:13:21
回答 2查看 81关注 0票数 1

最近,我在代码库中遇到了类似于下面的设置,我想知道是否有更好的方法来实现最干净的分离。

代码语言:javascript
复制
public class FileLoader
{
    public object LoadFile(filename);
    {
        return loadSomethingFromSomewhere(filename)
    }
    
    // new functionality
    public string GetFileVersion(filename);
    {
        return LoadFile(filename).version
    }

    private object loadSomethingFromSomewhere(filename)
    {
        return do().stuff().with(filename)
    }
}

代码已经加载了一个文件,现在我想从其中读取一些元数据。在业务逻辑中,所有这些元数据最终都会被丢弃,但是现在需要介绍一些重要的部分。

  • GetFileVersion是一个非常简单的修复程序,不会破坏任何兼容性。另一方面,我不喜欢它调用了另一个公共功能,然后在上面增加了一个额外的步骤。
  • 或者,您可以简单地在现有公共函数的基础上调整版本,并将其作为<object, string>元组返回,并附上版本。它现在并没有破坏责任,但理论上它确实破坏了整个代码库中的函数签名,并且它引入了并不总是需要的信息。

设计大师怎么说?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2020-12-04 14:15:53

您可以使用

代码语言:javascript
复制
public string GetFileVersion(filename)
{
   return loadSomethingFromSomewhere(filename).version
}

以避免同一个类中的另一个调用公共函数。

或者,您也可以使用元数据(包括版本)作为其成员字段的File类。

代码语言:javascript
复制
private File loadSomethingFromSomewhere(filename)
{
    return do().stuff().with(filename)
}

并分别返回file.getObject()file.getVersion

票数 3
EN

Software Engineering用户

发布于 2020-12-04 14:56:38

为了得到一个好的设计,您应该首先忘记类是如何实际实现的。从精神上抛弃非公共功能和公共功能的主体,问问自己,“作为这个类的用户,这个接口是否满足了我的需求,还是得到的数据太少或太多”。

例如,您的两个选项仅限于它们的公共接口。

代码语言:javascript
复制
public class FileLoader1
{
    public object LoadFile(filename);
    public string GetFileVersion(filename);
}

public class FileLoader2
{
    public tuple<object, string> LoadFile(filename);
}

从使用的角度来看,如果用户总是想同时检索版本和文件内容,那么第一种方法是很尴尬的。如果典型的调用方只想拥有文件数据或版本号,或者不想在同一时间/地点使用它们,那么第二种方法就很尴尬。

在确定了类对用户最友好的方式之后,就可以开始查看各种函数的实现了。如果你觉得自己讨厌给公众成员打电话,你总是可以这样做

代码语言:javascript
复制
public class FileLoader
{
    public object LoadFile(filename);
    {
        return LoadFilePrivate(filename)
    }
    
    // new functionality
    public string GetFileVersion(filename);
    {
        return LoadFilePrivate(filename).version
    }

    private object LoadFilePrivate(filename);
    {
        return loadSomethingFromSomewhere(filename)
    }

    private object loadSomethingFromSomewhere(filename)
    {
        return do().stuff().with(filename)
    }
}
票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/419643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档