问题标签 [design-guidelines]

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.

0 投票
14 回答
1631 浏览

c# - 在 C# 中防止错误使用支持字段的最佳方法

我有一个类(Foo),它延迟加载一个名为(Bar)的属性。防止未初始化的支持字段被错误使用(由于智能感知或缺乏经验的工作人员)的首选方法是什么?

我可以想到3个选项:

请记住,我希望人们使用支持字段栏的唯一地方是属性的 setter 和 getter。在课堂上的其他任何地方,他们都应该始终使用 this.Bar

更新

我目前正在使用以下延迟实现(不是针对所有具有支持字段的属性,而是针对需要延迟加载、同步和通知的选定属性)。它也可以扩展到支持期货(稍后在单独的线程中强制评估)

注意我的实现在读取时锁定,因为它支持外部集。

另外,我想提一下,我认为这是一个可以在Ruby 中克服的语言限制。

您可以通过这种方式实现惰性

0 投票
5 回答
2557 浏览

c# - 在 c# 中填充树结构的优雅且可维护的方式

我有一棵树。

我想填充一个大的用于单元测试目的。我真的很想保持干燥。

出于说明目的说我的树具有以下结构

您将如何以优雅且可维护的方式填充树?

我发现这段代码非常重复且容易出错:

编辑

我最终采用了 DSL 方法:

这里有一个演示测试

实施在这里

它使用一个构建器和一个简单的 DSL。

0 投票
1 回答
4615 浏览

single-responsibility-principle - 您何时违反 SRP(单一职责原则)?

SRPPDF版本;HTML版本)指出

改变班级的理由不应该不止一个

当您查看 Outlook 的日历事件窗口时,它有“保存关闭”按钮。

替代文字

因此,当保存关闭中的一个或两个的功能发生变化时,该按钮应该会发生变化。这显然违反了 SRP。

此功能既节省时间又方便,因为这是大多数用户在日历上保存约会时期望做的事情。

但是现在,我的问题是,除了该功能需要在 Outlook 中可用时,您还何时违反SRP

0 投票
2 回答
44250 浏览

c# - 命名空间命名约定

对于那些编写可重用组件的人,如果您要扩展 .NET 框架的功能,您认为最佳实践是什么?

例如,我目前正在创建一个 Pop3 库,因为 .NET 中不存在该库。我是创建自定义命名空间还是使用System.Net.Mail

0 投票
2 回答
959 浏览

c# - 用于命名布尔属性的 FDG 是什么?

命名布尔属性的框架设计指南是什么?如果没有,那你的建议是什么?

假设我有一个User类,我需要一个属性来指定用户是否启用。这些是我能想到的选项:

  • 使能够
  • 启用
  • 已启用
  • 禁用
  • 已禁用
  • 被禁用

此外,如果 BL 说用户必须默认禁用并显式启用,考虑到默认值System.Boolean是,我应该更喜欢“启用”变体false吗?

0 投票
4 回答
764 浏览

design-patterns - 单一职责原则 (SRP) 在什么抽象级别不再有意义?

我从一位同事那里得到了一个设计的回击,我想知道在这种情况下谁是正确的 SRP 应用是否存在共识。

我认为 SRP 主要与较低级别的设计细节有关,例如类责任。随着抽象级别的提高,我相信 SRP 仍然是相关的,但单一职责的定义也必然会向更高级别的抽象移动。

在我的具体情况下,在我看来“处理 foo、存储其结果并提供对这些结果的访问”的服务具有“foo 处理子系统”的单一责任,但是同事不同意并将其视为 2-3责任。我的情况是,如果您总是将单一职责分解为微小的细节,那么拥有“银行”就违反了 SRP,因为它“持有资金、维护账户、出售抵押贷款……”。

0 投票
2 回答
100 浏览

c# - 编写类型化 SQL 语句 API 的设计指南?

昨晚我在设计我的新项目时遇到了一些有趣的事情,这让我在这里提出了这个问题。

我的项目应该遵循 Table Gateway 模式,使用传统的 ADO.Net 数据集进行数据访问。我不想在我的数据访问类中编写普通查询。因此,我想出了一个想法,即编写一个解析器 kindaa api,它公开对象和方法,以便根据我的域对象在移动中生成查询。

稍后我希望这个 api 连接到我的业务对象并在业务对象实例上提供类型化 SQL 生成器 api。

任何想法或参考我该怎么做?这似乎很广泛,我不得不在这里接受你的意见。是否已经存在可以做到这一点的东西?

0 投票
4 回答
379 浏览

user-interface - 隐藏还是禁用?在这个例子中,一般来说

我有以下一组控件。

替代文字

场景一:

如果您选择前 3 个单选按钮之一并单击 Enter,焦点将跳转到 Passport Number 文本框。如果用户选择“其他”,则启用“其他,请指定”文本框,并且为方便起见,屏幕焦点(光标移动)到该文本框。

场景二:

“指定其他”文本框是隐藏的,直到用户单击“其他单选”按钮。这样做后,文本框变为可见并且光标放置在此文本框中。

您认为哪种方案更好?也许你有另一种变化?请说出你的理由。

如果您能就何时隐藏比禁用更好或反之亦然做出一个概括性的陈述,我也将不胜感激,但我也对这个特定示例感兴趣。

谢谢。

Afetrthought:也许,在第二个例子中,“请指定”文本只会在用户选择“其他”单选按钮后出现。

替代文字

0 投票
8 回答
573 浏览

internationalization - 代码“国际化”

我在不同国家从事不同的项目,并表示有时代码会变得国际化,比如

设置LargeurEtHauteur ()                            (对于 SetWidthAndHeight, fr )
Dim _ListaDeObiete as List(Of Object)   (对于 _ObjectList, ro )
internal void Sohranenie User ov ()             (对于 SaveUsers, ru )
等等。

碰巧在使用拉丁字母的国家,这种混合更为明显,因为不需要音译。

不仅如此,编程“行话”通常受到项目规范语言的启发。在某些情况下,“项目语言”中的术语具有在英语中不可“翻译”的含义。

还有一些项目仅适用于法国团队,例如使用法语单词(例如,Personne、Vehicule、Projet 等)。

在这种情况下,我个人在规范中添加了一个“字典”,它解释了所有业务对象名称,并且只有这些对象用于其他(法语)语言。

说:

Collectif - ensemble des Personnes ;

所有操作(获取、设置、更新、修改、加载等)都是英文的。

现在可以在代码中使用“强”名称: Add Personne To Collectif

  • 您对“国际化”的态度是什么?

PS。
我很高兴 VisualStudio 在 .NET 中使用名为“btnAdd É lève ”或“кпкСтоп”的按钮编译和运行项目...

0 投票
2 回答
22166 浏览

android - 在 Android 上同时将数据保存在内存和数据库中的最佳实践

我们正在设计一个包含大量数据(“客户”、“产品”、“订单”...)的 Android 应用,并且我们不希望每次需要一些记录时都查询 SQLite。我们希望尽可能避免查询数据库,因此我们决定将某些数据始终保存在内存中。

我们最初的想法是创建两个简单的类:

  1. “MemoryRecord”:一个基本上包含对象数组(字符串、整数、双精度、日期时间等)的类,这些对象是表记录中的数据,以及从中获取这些数据的所有方法大批。

  2. “MemoryTable”:一个基本上包含 [Key,MemoryRecord] 的 Map 以及操作此 Map 和将记录插入/更新/删除数据库的所有方法的类。

这些类将派生到我们在数据库中拥有的每一种表。当然还有其他有用的方法没有在上面列出,但在这一点上它们并不重要。

因此,当启动应用程序时,我们将使用这些类将这些表从 SQLite 数据库加载到内存中,并且每次我们需要更改一些数据时,我们都会在内存中进行更改,然后将其发布到数据库中。

但是,我们需要您提供一些帮助/建议。你能建议一些更简单或更有效的方法来实现这样的事情吗?或者也许一些现有的课程已经为我们做了?

我明白你们想向我展示什么,我为此感谢你们。

但是,假设我们有一个包含 2000 条记录的表,我需要列出这些记录。对于每一个,我必须查询其他 30 个表(其中一些有 1000 条记录,另一些有 10 条记录)以在列表中添加其他信息,而这正在“飞行”(如您所知,我们必须非常快此刻)。

现在你会说:“只需使用所有这些'连接'构建你的主查询,然后一步完成你需要的一切。如果你的数据库设计得很好,SQLite 可以非常快,等等......”。

好的,但是这个查询会变得非常复杂并且可以肯定,即使 SQLite 非常快,它也会“太”慢(2 到 4 秒,正如我所确认的,这对我们来说不是可接受的时间)。

另一个复杂点是,根据用户交互,我们需要“重新查询”所有记录,因为所涉及的表并不相同,我们必须与另一组表“重新连接”。

因此,另一种方法是只带主要记录(这永远不会改变,无论用户做什么或想要什么)而不连接(这非常快!),并且每次我们想要一些数据时查询其他表。请注意,在只有 10 条记录的表上,我们将多次获取相同的记录。在这种情况下,这是浪费时间,因为无论 SQLite 速度如何,查询、游标、获取等总是比仅仅从一种“内存缓存”中获取记录更昂贵。我想明确一点,我们不打算将所有数据始终保存在内存中,只是我们经常查询的一些表。

我们来到了最初的问题:“缓存”这些记录的最佳方式是什么?我真的很喜欢集中讨论这个问题,而不是“为什么需要缓存数据?”