1
4
将结果处理与数据检索分开。您的继承层次结构在ReadCommandBase中已经足够深了。 定义接口IDatabaseResultParser。实现ItemDatabaseResultParser和ListDatabaseResultParser,两者都使用ReadCommandBase类型的构造函数参数(也可以将其转换为接口)。 当你打电话给我DatabaseResultParser.Value()它执行命令,解析结果并返回类型为T的结果。
偏爱合成而不是继承。 看了样品我会更进一步。。。
|
2
1
我认为简单的答案是,在一个“为了保护你”而禁止多重继承的体系中,战略/授权是必要的 直接替代品。是的,您仍然会得到一些并行结构,例如委托对象的属性。但在语言的范围内,它被尽可能地最小化。
另一个大的替代方法是重构更大的设计结构,这样就可以从本质上避免这种情况,即给定的类由继承树中其上的多个“兄弟”或“表亲”类的行为组合而成。简而言之,重构为继承 而不是遗产 在采用我推荐的这种策略时,您将面临的挑战是,您已经在设计中做出了让步:您正在为“item”和“list”情况下的不同SQL进行优化。不管怎样,保持现状都会妨碍你,因为你给了他们平等的待遇,所以他们必然是兄弟姐妹。所以我想说,你想要摆脱这种“局部最大值”的设计优雅的第一步是回滚优化,并将单个项目视为它真正的样子:一个列表的特例,只有一个元素。您可以尝试稍后再次为单个项重新引入优化。但是等到你解决了目前困扰你的优雅问题。 但您必须承认,除了优雅的C代码之外,任何优化都会给C代码的优雅设计设置障碍。这种权衡,就像算法设计的“内存空间”共轭一样,是编程本质的基础。 |
3
0
正如柯克所提到的,这是授权模式。当我这样做时,我通常构造一个由委托者和委托类实现的接口。这减少了感知到的代码气味,至少对我来说是这样。 |
4
0
不那么简单的答案是,您可以使用代码生成工具、工具、代码dom和其他技术将所需的对象注入到所需的类中。它仍然会在内存中创建重复,但会简化源代码(代价是代码注入框架中增加了复杂性)。 这看起来可能和其他解决方案一样不令人满意,但是如果你仔细想想,这就是支持MI的语言在幕后所做的,连接在源代码中看不到的委托系统。 问题归根结底是,在简化源代码方面,您愿意付出多少努力。想想看,这是相当深刻的。 |
5
0
我没有深入研究过您的场景,但是我对C#中的双重层次问题有一些想法。为了在双重层次结构中共享代码,我们需要在语言中使用不同的构造:mixin、 trait (pdf) C# research -pdf )或者一个角色(比如 perl 6 ). C#使得用继承来共享代码非常容易(这不是代码重用的合适操作符),并且通过组合来共享代码非常困难(你知道,你必须手工编写所有的委托代码)。 有很多方法可以获得 kind of mixin 氧化剂( download )语言(用于.NET的对象Pascal)也有一个有趣的特性 interface delegation |
ali · flex box最佳实践 2 年前 |
Jan Wytze · Scala隔离特定平面图 6 年前 |
Scott Deerwester · 在Go中包装多个实现 6 年前 |
Moshe · 有没有办法做这个干衣机 6 年前 |
Josh Kelley · 惯用角形构件 6 年前 |
Karol Selak · 如何使用冗余的'let!`方法调用? 6 年前 |
Brandon Benefield · JS类和OOJ 6 年前 |
TheNovice · 跨两个Ruby模块继承/共享代码 6 年前 |