- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我最近参与的几个项目中,我几乎沉迷于以下编码模式:(我不确定是否有合适的名称,但无论如何...)
假设某个对象处于某种确定状态,我们不想从外部更改此状态。这些更改可能意味着任何行为,可能会调用任何算法,但事实是它们专注于更改某些对象的状态(成员状态、数据状态等...)。
让我们将一种改变这些对象的离散方式称为 Mutator
。 Mutators
(通常) 应用一次,它们有一些内部方法,如 apply(Target& target, ...)
,它会立即引发更改对象的状态(事实上,它们是某种功能对象)。
它们也可以很容易地融入链并逐一应用(Mutator m1, m2, ...
);它们还可以使用 virtual void apply(...)
方法从一些基本的 BasicMutator
派生。
我引入了名为 InnerMutator
和 ExplicitMutator
的类,它们在访问方面有所不同 - 首先,它们还可以更改 内部状态对象并应声明为友元(friend InnerMutator::access;
)。
在这些项目中,我的逻辑按以下方式工作:
对象
并将其设置为某个确定的状态foreach (mutator) mutator.apply(object);
现在是问题。
This scheme turnes to work well and (to me) seems as a sample of some non-standard but useful design pattern.
What makes me feel uncomfortable is that
InnerMutator
stuff. I don't think declaring mutator a friend to every object which state could be changed is a good idea and I wan't to find the appropriate alternative.Could this situation be solved in terms of
Mutators
or could you advice some alternative pattern with the same result?
谢谢。
最佳答案
我希望这不会被冒犯,但我不禁认为这种设计对于一个相当简单的问题来说是一个过于花哨的解决方案。
例如,为什么需要聚合突变体?一个人只能写:
template <class T>
void mutate(T& t)
{
t.mutate1(...);
t.mutate2(...);
t.mutate3(...);
}
这就是聚合变元,只是它是一个简单的函数模板,它依赖于静态多态性,而不是构成一个 super 变元的变元组合列表。
我曾经做过一些可能非常相似的事情。我制作了可以由运算符 && 组合成应用两个操作数(从左到右的顺序)的 super 函数对象的函数对象,这样就可以编写如下代码:
foreach(v.begin(), v.end(), attack && burn && drain);
它真的很简洁,当时对我来说真的很聪明,而且非常高效,因为它可以动态生成新的函数对象(不涉及运行时机制),但是当我的同事看到它时,他们认为我是疯狂的。回想起来,我曾试图将所有东西都塞进函数式编程中,这有它的用处,但在 C++ 中可能不应该过度依赖。写起来很容易:
BOOST_FOR_EACH(Something& something, v)
{
attack(something);
burn(something);
drain(something);
}
虽然它有更多的代码行,但它具有集中化和易于调试的优点,并且不会向使用我的代码的其他人引入陌生的概念。我发现专注于严密的逻辑比试图强行减少代码行更有益。
我建议您对此进行深入思考,并认真考虑是否值得继续使用这种基于更改器(mutator)的设计,无论它多么聪明和紧凑。如果其他人不能快速理解它,除非你有 boost 作者的权限,否则很难说服人们喜欢它。
至于 InnerMutator,我认为您应该像躲避瘟疫一样避开它。拥有可以像在这里一样直接修改类的内部结构的外部修改器类完全违背了拥有内部结构的很多目的。
关于C++程序设计题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134743/
我有两个关于这段代码的问题。 double*** pdata 和 int*** pmask 是什么意思?指向指针的指针?为什么或何时需要这样做? int 和 double 是不同的类型,double*
谁能用英文解释一下这是怎么回事? std::vector cats; //I get that cats is a vector of Cat objects if (std::find(cats.b
在C中,下列声明有区别吗: float DoSomething( const float arr[] ); 对比 float DoSomething( const float* arr ); 一个比另
我到 question 36我认为这很简单。像往常一样,我显然错了。我正在尝试在 Python 中执行此操作(因为我不知道 Python)。我的代码如下。我得到 19 作为输出,这显然是不正确的。我不
我已经通读了 MSDN 上的 Winsock2 文档,但如果有人能提供帮助,我仍然需要澄清一些事情。 我计划做一些类似于您在使用 WSAAsyncSelect() 时获得的设置,但使用一个单独的线程。
#include int main () { int *p = (int *)malloc((100*sizeof(int))); p++; free(p); /* do some
我想提供未知的“对象”并返回其成员之一的值。在 C# 中需要响应。 一般来说,我想我正在寻找这个方法的代码公共(public)静态对象 GetObjectMemberValue (object myO
由异常准确的 AI 提供支持的 20 个问题的简单在线游戏。 他们怎么猜得这么好? 最佳答案 您可以将其视为二进制搜索算法。在每次迭代中,我们都会提出一个问题,该问题应该会消除大约一半的可能单词选择。
拜托,有人可以解释一下吗: 如果文档说 STL std::vector finding element speed performace = O(ln(n)),这是什么意思。 O(ln(n)) - 什
我正在尝试通过遵循 Microsoft 为 ADSI API 和 Windows-RS crate 发布的 c++ 示例来使用 Rust 的事件目录。我不太明白这里发生了什么: https://doc
这是处理具有重复元素的单个列表的 nieve 案例,我在处理一些嵌套列表时遇到了麻烦,所以我想先写简单的案例。 所以我有: (defn packDuplicatesIntoLists [lis
我是新来的。我正在尝试解决此练习 Problem 18只是为了加强我的解决能力。我已经编码了答案。该任务要求“在 1,000,000 以下的质数中,有多少个数位之和等于两周中的天数?” (两周是 14
我正在尝试对POCO类中的某些字段进行索引,并将某些属性装饰为“忽略= true”,并且这些字段不应被索引,而应该被存储。我希望这些字段出现在搜索结果中,但不应作为索引。 我正在尝试对应索引的几个字段
我是编码的新手,正在尝试通过完成 Project Euler 问题来学习 Swift。我似乎有导致大量错误的不同版本的 Swift 代码。如果您对我的问题的格式有任何建议以供将来引用,请告诉我,谢谢。
对于problem statement在 google codejam 2008:第 1A 轮问题 3 In this problem, you have to find the last three
我是一名优秀的程序员,十分优秀!