构建分布式、可扩展的系统非常复杂,而且由于 IoT 和移动设备数量的不断增加,因此更加常见。我经常看到的一个问题就是开发人员试图将分布式系统视为单一系统。具体到,保留模式(如 ACID)的开发人员。
分类: Software Design
通宵软件设计提示: 提示 #2
对于《四夜的软件设计提示》的第二部分, 我想谈一些关于异常的问题。. net 中的异常提供了处理错误的绝佳方法。我们都知道不要使用异常来控制流, 但还有许多其他方法可以滥用异常。
滥用异常可以是任何东西, 从引发基本异常类, 到抛出的不仅仅是异常。但最常见的滥用异常处理的方法是简单地压制它们。我们都看到了一些应用程序, 它们执行类似于以下操作:
某业务对象 bo = SomeBusinessObject.LoadWithId(4); 尝试 { 博。值 = int。分析 (txt text领域. text); } 捕获 { 值不是 int..。所以忽略它。 } 博。保存 ();
抑制异常的问题在于, 大多数组件并不只是为了好玩而抛出异常, 因此首先引发异常的一些根本原因。
上面的例子看起来足够无辜。int32 的 parse 方法如果无法解析输入字符串, 则会引发异常。但是, 如果将来另一个开发人员认为业务对象的 "某种价值" 需要某种限制可接受值的业务规则, 该怎么办?
公共类某些业务对象 { 其他类代码 公共 int 某些值 { 获取 {返回 _ 某个值;} 集 { 如果 (值< 0)></ 0)> 引发新的业务规则异常 ("某些值的无效值"); _ 值 = 值; } } }
通宵软件设计提示: 提示 #1
数据库标识符并不重要..。向您的用户。当然数据库标识符对数据库很重要, 而且它们对您的数据访问层很重要, 但它们对应用程序的用户来说毫无意义。
《四夜》的软件设计小贴士: 序曲
设计软件就是试图理解构成其部分的逻辑。作为软件开发人员, 我们最多只能对我们应用程序的意图进行粗略的近似。即使是最彻底的需求收集也不能解释每一个最后的排列, 就像单元测试不能保证你的系统工作一样。
源代码管理适用于幼儿
你读到了正确的, 源代码管理是为幼儿准备的。不是给幼儿用, 而是为了保护我们免受他们的影响。当然, 产品的唯一目的, 如 subversion, tfs, 等。铝。是为了保护社会免受这些品脱大小的键盘爱的恐怖。
gdi + 中出现的一般错误
您知道, 当应用程序崩溃时, 您做得很好, 但有一个例外, 如 "gdi + 中发生了一般错误"。这是关于, 以及通用, 因为它得到:-)
在我的特殊情况下, 我正在使用 fromstream 方法在我的 dao 中构建一个图像, 如下所示:
图像结果; 使用 (filestream 文件 = file. openread (文件名)) { 结果 = 图像. fromstream (文件); 文件。关闭 (); } 返回结果;
我这样做是为了让我知道一个事实, 即文件被正确处置。我不想有任何孤立的文件引用锁定该文件的情况下, 我需要删除它。
问题是, 在我的 ui 中, 我试图调用 image 上的 save 方法, 将其内容转储到 asp. net 响应流, 如下所示:
Img。保存 (HttpContext.Response.OutputStream, imageforma. jpeg);
无 gac 安装的 aspnetserve
这个话题已经出现了很多次, 那就是 "为什么我必须在 gac 中注册 aspNETserve.Core.dll 才能运行 aspnetserve?" 这个问题的答案与 aspnetserve 如何使用 asp. net 宿主设施有关, 因此首先提供一些背景信息。
asp. net mvc-分离重定向操作
控制器可以执行 http 重定向到替代操作。这实质上相当于只做一个响应. 在 asp. net 中重定向。
不幸的是, redirecttoaction 的签名看起来有点像:
使用合同测试测试软件合同
合同, 无论是明示的还是隐含的, 都是设计工作软件系统的关键。c# 中显式协定的一个示例是接口的实现, 而隐含协定将是与所有业务对象具有默认构造函数的内容类似的内容。这两种类型的合同对于软件系统的成功至关重要, 但您如何测试和执行这些合同?
明确的合同通常由编译器强制执行, 并不像隐含合同那样脆弱。使用 ContractTest 测试框架, 您可以为许多常见的隐含合同编写测试用例。您可以将 ContractTest 断言直接合并到现有的单元测试中。对于下面的示例, 我将使用 nunit 语法, 但您可以使用大多数其他单元测试框架。
例如, 假设您要测试某个业务对象上是否存在可公开访问的默认构造函数。使用合同测试的这样的测试看起来就像。
使用合同测试. 断言; 使用 nunit. framework; 使用 mynamespace. 业务对象; [测试夹具] 公共类采样测试 { [测试] 公共空白试验 1 () { ContractAssert.Type.HasPublicDefaultConstructor<BizObjectA>();</BizObjectA> } }