最近,我在代码库中遇到了类似于下面的设置,我想知道是否有更好的方法来实现最干净的分离。
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>元组返回,并附上版本。它现在并没有破坏责任,但理论上它确实破坏了整个代码库中的函数签名,并且它引入了并不总是需要的信息。设计大师怎么说?
发布于 2020-12-04 14:15:53
您可以使用
public string GetFileVersion(filename)
{
return loadSomethingFromSomewhere(filename).version
}以避免同一个类中的另一个调用公共函数。
或者,您也可以使用元数据(包括版本)作为其成员字段的File类。
private File loadSomethingFromSomewhere(filename)
{
return do().stuff().with(filename)
}并分别返回file.getObject()和file.getVersion。
发布于 2020-12-04 14:56:38
为了得到一个好的设计,您应该首先忘记类是如何实际实现的。从精神上抛弃非公共功能和公共功能的主体,问问自己,“作为这个类的用户,这个接口是否满足了我的需求,还是得到的数据太少或太多”。
例如,您的两个选项仅限于它们的公共接口。
public class FileLoader1
{
public object LoadFile(filename);
public string GetFileVersion(filename);
}
public class FileLoader2
{
public tuple<object, string> LoadFile(filename);
}从使用的角度来看,如果用户总是想同时检索版本和文件内容,那么第一种方法是很尴尬的。如果典型的调用方只想拥有文件数据或版本号,或者不想在同一时间/地点使用它们,那么第二种方法就很尴尬。
在确定了类对用户最友好的方式之后,就可以开始查看各种函数的实现了。如果你觉得自己讨厌给公众成员打电话,你总是可以这样做
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)
}
}https://softwareengineering.stackexchange.com/questions/419643
复制相似问题