.NET, Software Design, 存档

通宵软件设计提示: 提示 #2

对于《四夜的软件设计提示》的第二部分, 我想谈一些关于异常的问题。. net 中的异常提供了处理错误的绝佳方法。我们都知道不要使用异常来控制流, 但还有许多其他方法可以滥用异常。

滥用异常可以是任何东西, 从引发基本异常类, 到抛出的不仅仅是异常。但最常见的滥用异常处理的方法是简单地压制它们。我们都看到了一些应用程序, 它们执行类似于以下操作:

某业务对象 bo = SomeBusinessObject.LoadWithId(4);
尝试 {
    博。值 = int。分析 (txt text领域. text);
} 捕获 {
   值不是 int..。所以忽略它。
}
博。保存 ();

抑制异常的问题在于, 大多数组件并不只是为了好玩而抛出异常, 因此首先引发异常的一些根本原因。

上面的例子看起来足够无辜。int32 的 parse 方法如果无法解析输入字符串, 则会引发异常。但是, 如果将来另一个开发人员认为业务对象的 "某种价值" 需要某种限制可接受值的业务规则, 该怎么办?

公共类某些业务对象 { 其他类代码 公共 int 某些值 { 获取 {返回 _ 某个值;} 集 { 如果 (值< 0)></ 0)> 引发新的业务规则异常 ("某些值的无效值"); _ 值 = 值; } } } read more

ASP.NET, 存档

将已部署的 asp. net 站点与 ndebend 进行比较

很少有东西可以与继承现有软件项目的经验相比, 当 (无论出于何种原因) 原始开发人员都不在公司。我自己也遇到过几次这种情况, 它永远不会失败, 你及时继承了代码库, 以修复 bug 或实现新功能。

每当发生这种情况时, 我担心的一个问题是, 网站的部署版本是否与源代码管理中的最新版本相匹配。在一个理想的世界里, 源代码控制系统会在最后一次部署时被标记, 他们的工作几乎不会有什么猜测。但生活很少是这种理想。实际上, 除了驻留在服务器上的二进制文件之外, 通常没有指示上次部署到生产中的时间和内容。

幸运的是, ndepend 有很多强大的功能, 可以帮助解决这个确切的困境。对于那些从未使用过 ndepend 的用户, 它是一个非常强大的. net 静态代码分析工具, 包含的功能比我在这里所能做到的要多。对于那些感兴趣的斯科特·汉斯曼在这里写了一篇伟大的评论, ndepend 网站上也有几个屏幕截图。

比较二进制文件

为了演示这一点, 我将把我目前部署的博客 (我恰好知道它正在运行 dasblog 版本 2.3) 与 dasblog 2.2 的已知版本进行比较。若要开始, 请确保您有要比较的两个网站的本地副本, 然后打开 ndebend 的副本。

若要比较源文件, 您甚至不需要创建项目文件。您只需从 visual ndebend gui 的 "比较" 菜单中选择 "选择要比较的程序集或分析"。

在本演示中, 我将仅比较随 dasblog 附带的新智能程序集, 但您需要比较这些程序集以表示您自己的自定义代码。例如, 如果您使用了 nhibernate orm, 则不一定要比较 nhibernate. dll。

选择要比较的程序集并单击 "确定" 后, n源将开始分析程序集的过程。根据程序集的数量和大小, 这可能需要一些时间。但是, 作为对你的小等待的奖励, 你很快就会受到足够多的代码指标的迎接, 即使是最仔细的人也会感到快乐。

挖掘结果

一旦执行了代码分析, 我们就可以开始手头的任务, 找到网站的两个版本之间的差异。对于此任务, 主屏幕中有两个值得关注的区域。类浏览器和 cql 查询窗口。

对于熟悉 visual studio 的任何人来说, 类浏览器都非常直观, 只需提供程序集、命名空间和类型的高级概述即可。对于即时满足, ndepd 善意地通过上下文菜单选项提供。从类浏览器右键单击您比较的程序集之一, 然后选择 "更改了什么?", 然后 "从装配公司选择方法..。在哪里 codewaschanged "。代替类浏览器, 您将看到不同版本的方法列表。

在场景背后, n源针对它在代码分过程中编译的内部数据库发出了它所谓的 cql (代码查询语言) 查询。此数据库包含有关源代码的各种有用信息。使用 cql, 我们可以做的不仅仅是选择已更改的方法。我们可以对返回的内容应用任意数量的约束。例如, 您可能不关心未使用的方法, 即使它们确实不同。使用 cql, 您可以使用如下所示:

从装配公司 "新智慧" 中选择方法。daslog. web " codewaschanged 和 ( 方法 ca > 0 或 ispublic or 单点或 异种接口或 类构造函数或 isfin治器 ) read more

.NET, 存档

在. net 2.0 下运行 codesmith 2。6

codesmith 是我时不时才拿出的工具之一, 但当我这样做的时候, 它真的派上用场。由于我对 codesmith 的使用相当有限, 我发现 codesmith 的免费软件版本正好满足了我的需求。

因此, 不用说, 当我开始 codesmith 看到一条错误消息, 通知我它需要. net 1.1 操作时, 我感到很失望。明智的做法本来是安装. net 1.1, 但这似乎是一个很大的麻烦, 因为我 (否则) 没有使用. net 1.1。我知道应用程序将尝试在没有1.1 的情况下在. net 2.0 下执行, 除非明确指示它不要这样做, 因此我开始查找阻止它运行的原因。

我首先转到 CodeSmith.exe.config 文件, 在那里我看到:

<startup></startup> <supportedRuntime version="v1.1.4322"></supportedRuntime> <supportedRuntime version="v1.0.3705"></supportedRuntime> <requiredRuntime version="v1.0.3705"></requiredRuntime> read more

.NET, C#, 存档

. net 扩展方法

从. net 3.5 启动是一种称为扩展方法的功能。扩展方法允许开发人员使用自己的实例方法扩展类。这是一个在其他语言中通常称为 "混战" 的概念。以下面的一段代码为例。在上面, 简单地说, 我们看到一个帮助器类, 它有一个静态方法来确定是一个字符串是 "短" 的。虽然这个例子很荒谬, 但它有助于说明扩展方法的根本愿望。通常情况下, 我们的源代码中到处都是与上面非常相似的帮助器类。在您的代码周围也到处都是此类实用程序类的用法。因此, 例如, 您将使用如下的用法:. net 3.5 中的扩展方法为上述内容提供了语法快捷方式。要将我们的 isshort 函数更改为 system. string 前缀的扩展到参数列表中。这就是将普通帮助器方法转换为. net 3.5 中的扩展方法所需的全部。但是, 有一些规则需要记住扩展方法。 read more

存档

将 dasblog 移动到 iis7

你们中的一些人可能已经注意到, 这个博客上的几个页面已经产生404错误, 在过去一周左右。这在一定程度上是由于我最近迁移到 windows server 2008 (iis7) 计算机。如果我在迁移后正确地 "测试" 驱动了网站, 大多数博客服务中断本来是可以避免的。但在匆忙中, 我只是将文件传输到远程服务器, 点击主页, 并称之为一个晚上。我几乎不知道大多数博客内容都是无法访问的。 read more

NHibernate, 存档

迁移到 nhibernate 2。0

在基于 nhibernate 的项目中工作时, nhibernate 文档通常非常方便。我将文档的 pdf 副本保存到 nhibernate 1.0 和1.2 在我的硬盘驱动器上, 因为我永远不知道何时需要引用它们。不幸的是, nhibernate 队似乎在2.0 版方面丢球了。nhibernate 网站不仅缺乏关于2.0 版的任何文档, 该网站的行为就好像2.0 版甚至还没有发布。与以前对框架的更新不同, 2.0 版表示对代码库的完全重构, 许多命名空间和对象已删除或重命名。尽管缺少官方文档, 但仍有多种资源可帮助您将现有的 nhibernate 1.2 应用程序迁移到 nhibernate 2.0。

重大更改的列表

nhibernate 论坛有一个主题, 讨论1.2 版和2.0 版的 alpha 预发行之间的重大更改。对于完整的列表, 请查看论坛, 但这里是您最有可能面临的。

 

问题: nhibernate. 表达式命名空间不再存在。

概述: 以前保存在此命名空间中的最值得注意的项是创建 icriteria 时使用的表达式对象。幸运的是, 这个物体仍然存在于 nhibernate 中。

解决方案: 替换所有 "正在使用" 的语句以反映命名空间的更改。

使用 nhbernna。这条线路不再需要在 nh 2。0
使用 nhbernate. 标准;   用这条线代替它。

 

问题: 不再使用 n触及配置部分 (很可能在 web. config 或 app. config 中)。

概述: nhibernate 2.0 不再查看名为 nhibernate 的配置部分, 而是查找名为 "休眠配置" 的配置部分 (请注意休眠中缺少 "n" 个)。此外, 配置部分不是简单地重命名的, 它承载着完全不同的架构。

解决方案: 简而言之, 整个配置部分将需要稍微重新设计。

首先, 您的配置部分声明必须更改其名称和类型:

<configuration></configuration> <configSections></configSections> <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" requirepermission="false"></section> read more