我最近遇到以下情况。
class A{
public:
void calculate(T inputs);
}
首先,A
表示物理世界中的一个对象,这是不将类拆分的有力论据。现在,calculate()
事实证明它是一个相当长且复杂的功能。我认为它有三种可能的结构:
- 写成一堵墙-优势-所有信息都集中在一个地方
private
在类中编写实用程序函数,并在calculate
主体中使用它们-缺点-类的其余部分不了解/不在意/不了解这些方法编写
calculate
以下方式:void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); }
可以认为这是好事还是坏事?这种方法有什么问题吗?总而言之,当我再次面临同样的情况时,我是否应该将此视为一种好方法?
编辑:
class A{
...
public:
// Reconfiguration of the algorithm.
void set_colour(double colour);
void set_density(double density);
void set_predelay(unsigned long microseconds);
void set_reverb_time(double reverb_time, double room_size);
void set_drywet(double left, double right);
void set_room_size(double value);;
private:
// Sub-model objects.
...
}
所有这些方法:
- 获得价值
- 计算其他一些值,而不使用状态
- 调用某些“子模型对象”以更改其状态。
事实证明,除了set_room_size()
这些方法之外,这些方法只是将请求的值传递给子对象。set_room_size()
另一方面,做几个屏幕的模糊公式,然后(2)做一个半屏的调用子对象设置器,以应用各种获得的结果。因此,我将函数分为两个lambda,并在函数末尾调用它们。如果我能够将其拆分为更多的逻辑块,那么我将隔离更多的lambda。
无论如何,当前问题的目标是确定该思维方式是否应持续存在,或者充其量是没有增加价值(可读性,可维护性,可调试性等)。
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
当然A
表示有关物理世界中可能存在的对象的数据。您可以有一个不含实物的实例,也可以有一个不含实物的实例,因此将它们视为一个且相同是没有意义的。A
A
calculate()
会知道这些子功能。
A
,则将其推到了极点。
A
代表了物理世界中的一个对象,这是不分裂类的有力论据。” 不幸的是,我在开始编程时被告知这一点。我花了好几年的时间才意识到这是一群曲棍球。这是对事物进行分组的可怕原因。我说不出什么有很好的理由组的事情(至少让我满意),但一个是一个,你应该马上放弃。最后,全部是“好的代码”,因为它工作正确,相对易于理解并且相对容易更改(即,更改没有怪异的副作用)。