问题标签 [design-principles]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 返回一个新对象与修改一个作为参数传入的对象
在代码审查期间,我遇到了以下代码。
我的直觉告诉我,这没有遵循正确的 OOP。
我认为 LoadObject 方法应该返回一个新的 SomeObject 对象,而不是修改传递给它的对象。虽然我真的找不到一个正确的解释为什么这更好。
我的解决方案更好吗?如果是这样,为什么?具体来说,在给定的代码示例(如果有)中违反了哪些 OOP 原则或标准?
android - 活动数量上限!
是否有关于应用程序可以拥有的活动数量的设计指南?如果有限制,可以捆绑在 Android 应用程序中的理想活动数量是多少。
design-patterns - 我是否应该关心传入 XML 设置文件的类表示违反了 demeter 定律?
我正在使用一种工具来自动生成分层组织的 XML 文件的类表示。XML 文件是我的应用程序需要能够访问的设置文件(只读)。
如果我将顶级节点(例如,AppSettings
)传递给需要访问一个或多个设置的类,我很容易得到如下所示的代码:
这似乎严重违反了得墨忒耳法则,但我想知道我是否应该在意。我可以不遗余力地只传递每节课所需的确切设置,但是在这种情况下,我无法看到这些多个点将如何伤害我。
将我的代码与我的 XML 文件格式紧密耦合是否可能会在未来产生维护问题或其他问题,或者这是一个不虔诚地遵循 OOP 设计原则有意义的示例?
oop - OOP中的“依赖倒置原则”是什么意思?
面向对象编程中的“依赖倒置原则”是什么意思?它有什么作用?
c# - 您可以将 OOP 应用于 Linq 投影吗?
使用
- 视觉工作室 2010
- .Net 框架 4
- C#
- Linq 到实体
问题
我希望能够将 DRY 和 SOLID 等面向对象的原则应用于一些 Linq 投影。到目前为止,通过编译的查询或传递的参数,我可以成功地将这些应用到 Linq 的其余部分,而不是在预测中。
如果这不可能,请告诉我,我必须选择我的替代解决方案之一(如下所述),如果可能,那么如何,或者如果我遗漏了某些东西,并且还有另一种替代实现可以满足目标。
细节
在高层次上,我希望能够使用标准的 Linq 查询或 CompiledQuery 动态控制 Linq 投影中使用的类型。我在我的示例和实际代码中使用 Linq to Entities,但是该问题应该适用于核心 Linq。
以下是非动态且无法解决问题的简单示例。它们被固定为始终对每种类型使用 FooUser。我想要做的是动态控制在投影中创建的用户类型,所有这些都将基于一个通用的 IUser 接口。这将或可能类似于我如何控制查询过滤器的类型。
替代解决方案
我试图遵守 DRY、SOLID,并且还试图避免使用枚举来处理这是典型的代码异味。然而,在我所有的尝试和研究中,我似乎不得不落入以下解决方案之一。
为每种类型实现一个查询,除了它们过滤的类型和投影中使用的类型之外,它们都是相同的。虽然这违反了 DRY 和 OCP,但我可以将其封装在一个类中,并将它们作为编译查询保持在一起。如果我添加新类型或查询数据的方式发生更改,这将需要更改类。
实现一个具有类型的枚举,并使用一个更通用的用户类,该类将其类型作为属性。但是,这将导致我不得不在多个位置使用枚举并引入长 case 语句来处理它们,我想避免这种情况。
我希望不必在不同的邪恶之间做出选择,并且有一个可以符合所有 SOLID 原则和 DRY 的实现。但是,如果必须,我想我最终会得到它的第一个或一个版本。
例子
标准的简单 Linq 查询
上述查询的编译版本
svn - 需要存储库布局参考
我期待一场关于 Subversion 存储库的战斗:目前我们有一个 Web 应用程序,它被签入为 3 个主要项目和 2 个报告项目(当我 6 个月前开始时),现在多达 7 个项目,并且预计会进一步增长.
对我来说很明显这是不对的,如果你想合理使用版本控制系统,编译的可执行文件不能跨越版本控制边界。对单个功能进行一次签入是不可能的,这对我来说似乎很重要。
但是当我试图解释这一点时,我觉得我在挥手。有没有人有任何参考资料,对于 Subversion 或一般来说,列出了这个原则并在它背后有一些权威?我已经做了一些搜索,只是没有想出我需要的东西。
oop - 面向对象的原则应该应用在过程语言中吗?
我知道原则上甚至可以将诸如 C 或 MATLAB 之类的过程语言转换为面向对象的语言。这个问题已经在这里和这里得到了很好的讨论。
我发现这些讨论和其中的参考文献中缺少的是关于是否应该应用这些原则的说明。这样做有什么具体的收获吗?这显然是可能的,但这样做是否可取?在开源项目中是否有这种做法带来明显优势的例子?
澄清
也许一个例子是为了。
我继承了一些实现机器学习算法的 MATLAB 代码。基本上只有一个函数building_model
,根据传递的标志,将训练模型或使用它来预测未来值:
和
模型本身是使用 MATLAB 持久变量实现的building_model
。
我已经building_model
分成了两个功能,一个用于训练,一个用于预测。过去作为持久变量实现的模型现在被外部化了,可以这么说:
粗略地说,这是我可以在 MATLAB 中模拟 OOP 的某些功能的情况。我的建筑模型模块现在的行为很像一个类,有一个构造函数和两个方法model_train
,model_predict
. 我已经实现了某种程度的封装(尽管没有什么能阻止调用者摆弄 的内部model
),并且原则上也可以容纳多态性。作为额外的奖励,我几乎免费获得命令/查询分离,因为model_predict
不会返回model
,因此可能不会改变model
。
(精明的读者会指出,MATLAB 已经有一个面向对象的系统。由于各种原因,包括性能和与旧版本的兼容性,我不能使用它。)
我可以在 C 中想象一个类似的机制,您可以在其中设计一些数据结构并编写函数,其第一个参数将是该数据结构的实例。
我想知道的是,我可以将这种编程方式推进多远?这是一种普遍接受的模式吗(在那里,我说过这个词)?有什么我应该注意的性能问题吗?
java - 使用 Java 的 instanceOf 是否符合“程序到接口”的设计原则?
如您所知,“程序到接口”设计原则广泛偏爱超类型而不是具体类型或实现。
在Java程序中使用instanceof从超类型派生具体类型是否符合原理?
在我的应用程序中,Storehouse 是一个抽象超类型类,具有几个私有变量和公共 getter 和 setter。
ConcreteStorehouseA 继承自 Storehouse,有很多具体的方法和变量。ConcreteStorehouseB 类似但不同。
我的应用程序收到一个仓库。但是,Storehouse 不是一个有用的类型。因为唯一真正有用的方法包含在具体类型中,所以我使用 instanceof 如下:
使用instanceof是否符合原理?
编辑:
本质上,该应用程序是桌面角色扮演游戏 Shadowrun 的骰子模拟器。具体类型是不同的测试类型——成功测试、反对测试、扩展测试——它们的成功运行都有非常不同的因素和参数。超类型本质上包含骰子池!
design-patterns - 评论我的设计 v2
不久前,我发布了我正在制作的应用程序的类图。得到了一些有用的提示并开始工作。设计确实很难!无论如何,我做了一个 2.0 版,但遇到了其他事情。也许有人可以就我的类图提供指点、评论或建议:-)
首先,我在 SomeInterface 中有“Speed”作为Sprite抽象类的一部分。经过考虑,我认为这不是放置“速度”的最佳位置。一个不太好的事情是我无法为界面命名,而且我不知道在属性或操作隔间中将“速度”放在哪里,因为它是一个属性......
每个对象(子弹、入侵者、船)都以自己的速度移动,所以我将“速度”放入界面。所有对象都继承自超类Sprite,并且仅覆盖 Update() 方法。Bullet抽象类对从Sprite获得的 Update 方法没有任何作用,它只是显示它是从那里获得的。我不知道这是否是正确的方法,或者我应该把它排除在外,只在覆盖它的类中显示它?
另一个我不知道如何处理的问题是入侵者制作的动画。我得到了以下属性:SheetSize、FrameSize 和 CurrentFrame。工作表包含外星人图片(如翻书),FrameSize 仅用于选择工作表上的帧,而 CurrentFrame ......嗯,保存当前帧。由于 Ship 和 Bullet 没有动画,因此这些属性对它们没有用处。把它们放在哪里?
最后,我没有在哪里实现IBulletBehavior。首先,我让每个子弹行为都实现了 IBulletBehavior,但切换到让抽象 Bullet 类实现它。有没有规定要拿哪一个的规则?
c# - 我应该支持 IEnumerable还是数组?
在我从事的许多项目中,每当我必须返回只读集合时,我都会使用IEnumerable<T>
接口并使其类型特定,如下所示:
大多数时候,我返回一个列表,但在某些函数和只读属性中,我返回一个数组,该数组也符合扩展方法的目的。
我的问题是我是否通过返回s 而不是特定类型(例如:、、或s)违反了任何设计原则IEnumerable<T>
List<T>
HashSet<T>
Stack<T>
Array
?