你能发一个真实的,过度的意大利面条代码的简短例子,可能会说它的作用是什么?你能告诉我一个小调试器的噩梦吗?
我不是指IOCCC代码,那是科幻小说.我的意思是发生在你身上的现实生活例子......
重点已从"发布一些意大利面条代码"到"什么是改变究竟面条代码?".从历史的角度来看,目前的选择似乎是:
我经常被要求对由真正的火箭外科医生建造的系统进行维护工作.这有很多错误,很难知道从哪里开始.
不,等等,我将从一开始就开始:在项目的早期阶段,设计师被告知系统需要扩展,他会读到可扩展性问题的根源是应用程序和数据库之间的流量服务器,所以他确保最小化这种流量.怎么样?通过将所有应用程序逻辑放在SQL Server存储过程中.
认真.大量的应用程序由HTML前端制定XML消息.当中间层接收XML消息时,它使用文档元素的标记名作为它应调用的存储过程的名称,并调用SP,将整个XML消息作为参数传递给它.它接收SP返回的XML消息并将其直接返回到前端. 应用程序层中没有其他逻辑.
(这里是在中间层验证对架构库传入的XML消息的一些代码,但我删除了,经查1后)只有消息的极少数曾与架构,2)消息实际上并没有符合对于这些模式,以及3)在验证消息之后,如果遇到任何错误,该方法将丢弃它们."这款保险丝盒可以节省时间 - 它来自工厂预装的便士!")
我以前见过那些做错事的软件.很多.我写了很多.但我从来没有见过任何像钢铁般的决心做出错误的事情,在每一个可能的转折点,这都体现在这个系统的设计和编程中.
好吧,至少他跟他所知道的一样,对吧?嗯.显然,他所知道的是Access.他并不真正理解 Access.或数据库.
以下是此代码中的常见模式:
SELECT @TestCodeID FROM TestCode WHERE TestCode = @TestCode SELECT @CountryID FROM Country WHERE CountryAbbr = @CountryAbbr SELECT Invoice.*, TestCode.*, Country.* FROM Invoice JOIN TestCode ON Invoice.TestCodeID = TestCode.ID JOIN Country ON Invoice.CountryID = Country.ID WHERE Invoice.TestCodeID = @TestCodeID AND Invoice.CountryID = @CountryID
好的.您也不信任查询优化器.但是这个怎么样?(最初,我打算在你曾经遇到过的源代码中最好的评论中发布这个内容吗?但我意识到还有更多的内容要写,而不仅仅是这一条评论,事情就失控了.)许多实用程序存储过程结束时,您将看到如下所示的代码:
-- Fix NULLs SET @TargetValue = ISNULL(@TargetValue, -9999)
是的,那段代码完全是你不能让自己相信它正在做的事情,以免你被激怒.如果变量包含NULL,则通过将其值更改为-9999来警告调用者.以下是这个数字的常用方法:
-- Get target value EXEC …
我在不同的公司中使用不同版本的.NET编写的许多遗留系统,我不断寻找以下模式的示例:
public void FooBar()
{
object foo = null;
object bar = null;
try
{
foo = new object();
bar = new object();
// Code which throws exception.
}
finally
{
// Destroying objects
foo = null;
bar = null;
}
}
Run Code Online (Sandbox Code Playgroud)
对于任何知道内存管理在.NET中如何工作的人来说,这种代码是非常不必要的; 垃圾收集器不需要您手动分配null以告知可以收集旧对象,也不需要分配null指示GC立即收集对象.
这种模式只是噪声,使得理解代码试图实现的内容变得更加困难.
那么,为什么我一直在寻找这种模式呢?是否有一所学校教授这种做法?是否有一种语言,null需要为本地范围的变量赋值才能正确管理内存?明确指定null我还没有得到一些额外的价值吗?
如果这是重复,我道歉,但我在相关问题中找不到关于该主题的任何具体示例.
在阅读了Martin Fowler关于"贫血领域模型"的文章之后,我不知道为什么这被认为是一种反模式.大多数企业开发人员甚至认为它是一种反模式,因为AFAIK可能有90%的j2ee应用程序是以"贫血"方式设计的?
有人可以推荐进一步阅读这个主题(除了"领域驱动设计"一书),或者甚至更好,给出一个具体的例子来说明这种反模式如何以一种糟糕的方式影响应用程序设计.
谢谢,
java architecture domain-driven-design anti-patterns anemic-domain-model
Martin Fowler认为Anemic Domain Model是一种反模式.
由于Object Relational Impedence Missmatch,将持久性模型作为域模型滚动似乎也很严重.对于持久性和规范化的问题,我们倾向于将类分解为非常小的小块,在这些类之上打字方法是愚蠢的.加上持久性很少发生变化,但业务逻辑变化很大.
所以我们需要一个基于持久性模型构建的DomainModel(而不是同一个).然后,此域模型将包含业务逻辑属性和方法.
但是现在这些领域模型仍然落后于服务,为了将它们暴露给外部世界,我们需要将它们转换为DTO.
我们在这里做的是manny mappings.
它不会在那里结束,因为DTO可能需要映射到ViewModel.
所有这些以及重复验证逻辑的问题仍然没有消失,因为客户需要实时验证.ViewModel对验证一无所知,因此在SPA中,您不得不在客户端(通常使用javascript)再次重写验证逻辑.
服务本质上是无状态的(消息或面向RPC),所以我们在Persistence,OO之间进行所有这些映射,然后返回到Procedural,有什么好处?您如何证明大多数IT预算的实际成本?
我知道如何拥有完整的DDD,使用Aggregate Roots,Domain Models等会很"酷",但你怎么能证明成本和开发效率的打击?
反模式(或反模式)是社交或商业运营或软件工程中使用的模式,可能是常用但在实践中无效和/或适得其反
如果是这样,DDD和Rich Domain Model不会适合上面的反模式定义而不是"精益"域模型.对不起,我鄙视加载的单词"Anemic".
通过保持域模型,"精益"你实际上允许它被共享而不违反"抽象依赖原则","不要重复自己"以及将一个数据载体映射到另一个数据载体的耗时,繁琐且容易出错的过程,以及除此之外的任何相关单元测试(除非您考虑使用单元测试进行映射并希望获得最佳效果).
architecture design-patterns domain-driven-design anti-patterns
首先我要说的是,我并不提倡这种做法,但我最近才看到它,我想知道是否有一个名字,我可以用它指出有罪的一方.所以这里.
现在你有了一个方法,并且想要返回一个值.你也想返回错误代码.当然,异常是一个更好的选择,但无论出于何种原因,你想要一个错误代码.记住,我在这里扮演魔鬼的拥护者.所以你创建了一个泛型类,如下所示:
class FunctionResult<T>
{
public T payload;
public int result;
}
Run Code Online (Sandbox Code Playgroud)
然后声明你的函数:
FunctionResult<string> MyFunction()
{
FunctionResult<string> result;
//...
return result;
}
Run Code Online (Sandbox Code Playgroud)
此模式的一个变体是使用枚举来表示错误代码而不是字符串.现在,回到我的问题:这是否有一个名称,如果是这样,它是什么?
在经典的"四人帮"列表中,您是否经常发现任何被滥用,误解或过度使用的设计模式(除了备受争议的单身人士之外)?换句话说,有没有一种设计模式,建议您在使用前三思而后行?(为什么?)
在阅读了关于这种反模式以及其中关于它的许多问题之后再次感到困惑.
如果我有一个域模型并捕获必须保存在数据传输对象中的数据,那么这会使我的域模型成为数据的包装器吗?在那种情况下,我将使用贫血域模型.但是,如果我在该包装器上添加足够的域逻辑,那么它在什么时候成为真正的域模型呢?
我得到的印象是,捕获域模型中必须保留的内容会违反良好实践并创建贫模型域模型反模式.然而,如果你使用关系数据库,就没有办法避免挑出构成对象状态的部分并保存它.
因为我对这些概念很困惑,所以我不确定我所写的内容是否有意义.随意要求澄清.
design-patterns domain-driven-design anti-patterns anemic-domain-model
有谁知道重构上帝对象的最佳方法?
它并不像将它分成许多较小的类那样简单,因为有很高的方法耦合.如果我拿出一种方法,我通常会把所有其他方法拉出去.
我有两个简单的方法:
public void proceedWhenError() {
Throwable exception = serviceUp();
if (exception == null) {
// do stuff
} else {
logger.debug("Exception happened, but it's alright.", exception)
// do stuff
}
}
public void doNotProceedWhenError() {
Throwable exception = serviceUp();
if (exception == null) {
// do stuff
} else {
// do stuff
throw new IllegalStateException("Oh, we cannot proceed. The service is not up.", exception)
}
}
Run Code Online (Sandbox Code Playgroud)
第三种方法是私有帮助方法:
private Throwable serviceUp() {
try {
service.connect();
return null;
catch(Exception e) { …Run Code Online (Sandbox Code Playgroud) java error-handling exception-handling anti-patterns exception
anti-patterns ×10
architecture ×2
java ×2
.net ×1
c# ×1
class ×1
exception ×1
god-object ×1
oop ×1
refactoring ×1
terminology ×1