我最近一直在非常认真地阅读罗伯特·C·马丁(又名鲍勃叔叔)的书籍。我发现他谈论的很多东西对我来说都是真正的救星(小函数大小,非常具有描述性的名称,等等)。
我还没有解决的一个问题是代码耦合。我不断遇到的一个问题是我将创建一个对象,例如包装数组的对象。我确实会在一个类(class)中进行一些工作,但随后必须调用另一个类(class)在另一个类(class)中进行一些工作。到了我将相同数据传递 3-4 层深度的程度,这似乎没有意义,因为很难跟踪该对象传递的所有位置,所以当需要更改它时我有很多依赖。这看起来根本不是一个好的做法。
我想知道是否有人知道更好的方法来处理这个问题,鲍勃的建议(尽管可能是我误解了)似乎让事情变得更糟,因为它让我创建了更多的类。提前致谢。
编辑:按请求提供一个现实世界的示例(是的,我完全同意,否则很难理解):
class ChartProgram () {
int lastItems [];
void main () {
lastItems = getLast10ItemsSold();
Chart myChart = new Chart(lastItems);
}
}
class Chart () {
int lastItems[];
Chart(int lastItems[]) {
this.lastItems = lastItems;
ChartCalulations cc = new ChartCalculations(this.lastItems);
this.lastItems = cc.getAverage();
}
class ChartCalculations {
int lastItems[];
ChartCalculations (int lastItems[]){
this.lastItems = lastItems;
// Okay so at this point I have had to forward this value 3 times and this is
// a simple example. It just seems to make the code very brittle
}
getAverage() {
// do stuff here
}
}
最佳答案
查看示例代码,您的 Chart 类与 ChartCalculation 类紧密耦合(它正在实例化它的一个新实例)。如果 Chart 类通过接口(interface)(我的示例代码中的 IChartCalculation)使用 ChartCalculation,则可以删除这种耦合。 Chart 类使用的 IChartCalculation 的具体实现可以通过其构造函数 ( dependency injection ) 传递给 Chart 类,也许可以通过 factory class 传递给 Chart 类。 。另一种方法可能是使用 IOC框架(尽管这通常可能会带来不必要的复杂性)。通过这种方式,Chart 类可以使用 IChartCalculation 的不同具体实现,并且只要它们被编码为/实现接口(interface),它们就可以独立变化。
class ChartProgram ()
{
int lastItems [];
void main () {
lastItems = getLast10ItemsSold();
Chart myChart = new Chart(lastItems, new ChartCalculations());
}
class Chart
{
int[] lastItems;
IChartCalculation chartCalculations;
public Chart(int[] lastItems, IChartCalculations cc)
{
this.lastItems = lastItems;
chartCalculations = cc;
int average = cc.GetAverage(lastItems);
}
}
interface IChartCalculation
{
int GetAverage(int[] lastItems);
}
class ChartCalculation : IChartCalculation
{
public int GetAverage(int[] lastItems)
{
// do stuff here
}
}
关于design-patterns - 使用敏捷方法或其他方式编写松散耦合代码的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1788267/