`

架构的演化和不断新兴的设计

    博客分类:
  • DDD
阅读更多

原文 http://www.jdon.com/jivejdon/thread/39232

 

Evolutionary architecture and emergent design: Leveraging reusable code, Part 1

这是IBM的一篇文章,一旦你确认了惯用的模式,下一步你就进入收获期,理解设计和代码之间关系,能够发现可重用复用的代码,这篇文章阐述了代码与设计的关系,指出重要是用一个可表达有表现力的语言,然后重新不断思考抽象,挖掘潜在价值。

文章指出两个惯用模式:
1.技术模式,这些模式强调事务 安全和其他底层技术元素。
2.领域模式,这些包括解决业务应用的通用方案。

文章认为:设计就是代码。从表现力和抽象风格来谈论两者关系。完整的代码是设计工作的目标和结果。

理解这个点就不能理解为什么一些开发失败。比如MDA模型驱动架构中,试图直接从UML产生代码,这是失败的,因为UML语言不够表现力,不够丰富,不能表达细微差别。

要认识到设计是最昂贵的活动(banq:有些公司开发图形化的拖曳或快速开发软件方式,从方向上应该迟早会失败的,如果你能通过开发专门工具来解决这个最昂贵的活动,那么你就是上帝了)。

当 然并不是反对你用UML,一旦代码出来后,你就要明白你进入了新的设计阶段,你就要迁移到这个阶段,这个阶段可读性设计是关键(banq:有些图形化开发 工具开发或生成出来的代码几乎不能看,二次开发还需要通过开发工具去修改代码,不能直接阅读代码,这个方向也大大出错了,不过因为中国人不懂英语,所以中 国软件公司总是试图阻止程序员直接读英文程序代码,而是搞图形化界面,结果越搞越复杂)。

而让代码变得可读,就要使用一些惯用的模式,这样就越容易修改维护拓展,凡是知道这些惯用模式的程序员都能读懂你的代码。(当然这个要求对程序员要高,不但要懂Java语言,还要懂模式)

banq总结:整篇文章虽然没有提DDD ,但是和DDD 或MDD领域驱动设计开发思想是一致的。

 

文章在语言表达力上使用Java Groovy和Ruby来进行了比较,暗指这些语言在细节表达力上要强于UML或其他图形化表达手段。

下面是一段增加订单的业务操作和技术事务 保证操作混合在一起的代码:

public

 void

 addOrderFrom(ShoppingCart cart, String userName,
                     Order order) throws SQLException {
    setupDataInfrastructure();//底层技术




    try

 {
        add(order, userKeyBasedOn(userName));

//业务操作




        addLineItemsFrom(cart, order.getOrderKey());

//业务操作




        completeTransaction();

//底层技术事务








    } catch

 (SQLException sqlx) {
        rollbackTransaction();
        throw

 sqlx;
    } finally

 {
        cleanUp();
    }
}




很显然,这段代码违背职责单一原则,我们需要对其分离,分离后可再组合应用。使用command模式:
public

 void

 wrapInTransaction(Command c) {
    setupDataInfrastructure();
    try

 {
        c.execute();
        completeTransaction();
    } catch

 (RuntimeException ex) {
        rollbackTransaction();
        throw

 ex;
    } finally

 {
        cleanUp();
    }
}

public

 void

 addOrderFrom(final

 ShoppingCart cart, final

 String userName,
                         final

 Order order) throws SQLException {
    wrapInTransaction(new

 Command() {
        public

 void

 execute() {
            add(order, userKeyBasedOn(userName));
            addLineItemsFrom(cart, order.getOrderKey());
        }
    });                
}

熟悉Spring+hibernate可以知道,其HibernateTemplate中就是如此实现的。

如果使用Groovy来实现,则会更加具备可读性:
public

 class

 OrderDbClosure {
   def wrapInTransaction(command) {
     setupDataInfrastructure()
     try

 {
       command() //关键一句 直接运行方法体内代码




       completeTransaction()
     } catch

 (RuntimeException ex) {
       rollbackTransaction()
       throw

 ex
     } finally

 {
       cleanUp()
     }
   }
   
   def addOrderFrom(cart, userName, order) {
     wrapInTransaction {
       add order, userKeyBasedOn(userName)
       addLineItemsFrom cart, order.getOrderKey()
     }
   }
}



由于Groovy语言内置了command模式,所以这里实现起来更加简单直接。

使用ruby实现:
def wrap_in_transaction
  setup_data_infrastructure
  begin
    yield //关键一句




    complete_transaction
  rescue
    rollback_transaction
    throw


  ensure
    cleanup
  end
end

def add_order_from
  wrap_in_transaction do


    add order, user_key_based_on(user_name)
    add_line_items_from cart, order.order_key
  end
end




通过Java以及Java的框架 以及groovy与Ruby比较,展现了语言表达力的魅力,这里体现了模式和语言的关系:如果你为汇编语言找一套惯用的模式是非常困难的,因为语言本身增加了很多不透明因素让你无法看到真正的设计。

由于设计就是代码,代码就是设计,你必须选择最能表达你设计的语言,凭借语言的表现力可以跟容易看到你惯用的模式,也就更容易看到你的设计。


文章认为设计或编码是一项精益活动,精益活动有一个原则:你等待时间越长,你就越有机会寻找到合适的设计。

个人观点:个人体会,不愿意做项目期限很紧的软件,愿意一直精益做好一个软件,比如JiveJdon ;有新项目时,也不是急于立即下手,而是让自己等待。越长时间进行设计决定,你就拥有越多的设计语境,对设计的场景背景就越多理解,就能越多寻找到合适的设计。

当你在一个语言上工作很久,会陷入一种具体战术性细节,而忽视抽象战略思想,当你拥有一把锤子,每个问题看起来都是钉子,每个问题都可以使用你熟悉的语言来抽象解决。

如 果你熟悉java语言,再使用面向函数语言如scala等,你的思维方式就会不一样,你就不会再用你熟悉的锤子从一个角度解决问题,而是更换了另外一个角 度,比如Java中数据结构缺省是可变的,这在一个多线程环境中是危险的,你可以使用很多代码和模式在Java中实现不可变;但是Scala这些语言数据 结构缺省是不可变的,那么在多线程环境中就显然更加干净。

OOPSLA 2006曾经提出反对象概念:"Collaborative Diffusion: Programming Antiobjects" , 引入一个叫反对象antiobject, 它也是一个对象,但是它是我们通常认为应该是什么样的反面。这实际是用来扩展我们的思维的一种方法,否定之否定,从另外一个角度重新思考需求,重新思考问 题。

分享到:
评论

相关推荐

    系统架构设计师教程第二版

    - 架构演化的过程与策略。 - 架构维护的最佳实践。 - 架构重构的原则与方法。 5. **未来信息综合技术**: - 云计算、大数据、人工智能等新兴技术的应用。 - 技术发展趋势与挑战。 - 新技术对架构设计的影响。...

    系统架构设计师-论文题目汇总.pdf

    它涉及的领域包括但不限于软件开发过程、软件体系结构的演化、面向服务架构设计、NoSQL数据库技术、软件架构风格、软件系统建模方法、无服务器架构、软件质量保证、软件系统架构评估、软件设计模式、数据访问层设计...

    自演化智能软件系统平台的架构设计和技术研究.pdf

    1. 自适应智能系统平台(AISP):AISP是一种新兴的软件平台,旨在通过自适应领域模型调整架构,以适应不断变化的外部环境。它整合了XML、人工智能、数据挖掘、自适应软件框架等前沿技术和热门领域,用于软件开发语言...

    [软考在线]_[2020年下半年考试复习资料]系统架构设计师学习.pdf

    这些方法通常包括多种技术实践和设计模式的综合运用,以构建高质量的软件系统。 6. 系统架构分析与评估:包括对架构的评审、测试、验证等过程,确保系统架构设计满足预定的需求,并且在成本、性能和可靠性方面达到...

    软件架构实践

    架构师需要不断学习和适应这些新技术,以便在快速变化的IT环境中保持竞争力。 总之,《软件架构实践》是一本全面而深入的指南,它为架构师提供了实用的方法论和丰富的案例,帮助他们在实际工作中做出明智的架构决策...

    基于复杂网络理论的Java开源系统演化分析.pdf

    优先连接的倾向有助于软件保持其结构稳定性和演化连续性,避免了频繁的重构和整体架构的破坏,从而在系统复杂度不断增长的情况下,仍然能够维持其鲁棒性。 复杂网络理论对软件演化分析的重要意义在于,它提供了一种...

    SOA架构说明(清华)-内部文档

    随着信息技术的进步和商业模式的变化,特别是互联网的兴起和发展,企业架构的概念也在不断演进。当前的企业架构不仅要考虑传统的IT系统设计,还要考虑如何利用云计算、大数据、物联网等新兴技术来构建更加灵活、可...

    区块链文献主题发现及演化研究.pdf

    结果表明,区块链技术已经延伸到多个学科和领域,成为下一代信息革命的主要支撑技术,促进了新兴技术的融合与发展。 最后,本研究从区块链思想、核心技术和应用领域三个维度进行了讨论,并对区块链技术的发展趋势和...

    DDD领域驱动设计day01.pdf

    - 在技术架构演化中,DDD支持模块化设计,有利于系统的持续演进和微服务化。 课程内容包括: - 第一天主要介绍DDD设计篇,通过事件风暴法进行业务领域建模,建立统一语言建模,理解成为顶级业务架构师的本质。 - ...

    电子电器架构车载软件 - 集中化架构软件开发

    #### 二、从CP演化到AP以适应自动驾驶兴起和车载以太网 随着自动驾驶技术的发展和车载以太网的普及,原有的AUTOSAR CP(Classic Platform)逐渐显露出局限性,因此需要向更为先进的AP(Adaptive Platform)进行转变...

    软件设计师题目解析同步版

    6. **软件架构与设计模式**:讲解了多种软件设计模式和架构风格,如MVC、微服务、面向对象设计原则等,这些是提高软件可扩展性和可维护性的关键。 7. **法律法规与标准化知识**:包括知识产权法、软件版权、信息...

    AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf

    9. 系统设计和架构的演化:从文档内容的变化可以推断,随着技术的进步和市场需求的变化,AUTOSAR分层软件架构经历了持续的演化,以包含新兴技术和满足汽车行业对软件和电子系统日益增长的需求。 10. 软件开发的最佳...

    众多的国外著名大学计算机的博士论文和硕士论文(软件设计和软件工程).rar

    3. 架构设计:探讨不同软件架构风格,如微服务架构、事件驱动架构以及分层架构,分析其优缺点和适用场景。 4. 用户体验设计:强调用户界面和交互设计的重要性,研究如何提高软件的人性化和易用性。 5. 可测试性...

    基于动态演化博弈的互联网金融监管研究.pdf

    随着互联网技术的快速发展和金融体系的持续完善,互联网金融作为新兴领域,在为市场参与者提供便利的同时,也带来了监管难题。文章从动态演化博弈的角度对互联网金融监管进行了深入研究,并尝试为相关政策的制定和...

    喻勇 孙宏亮-Container技术在Cloud Foundry中的应用和演化

    Cloud Foundry架构由多个内核组件组成,这些组件通过消息机制实现自动发现和松散耦合。核心组件包括UAA(用户账户和认证服务)、Login Server、Health Manager、Service Broker、Node(s)、DEA Pool(s)、User ...

    跨境电商研究热点及演化脉络解析.pdf

    总结而言,跨境电商作为一种新兴的贸易形式,在推动国际贸易发展和促进全球资源优化配置中扮演着重要角色。本文通过分析文献计量数据,揭示了跨境电商的研究热点和演化脉络,为未来的行业发展和研究提供了科学依据。

    软件体系结构张友生.rar

    10. **技术趋势与新兴架构**:云计算、大数据、物联网等新技术的发展,推动着新的架构模式出现,如Serverless、容器化和Kubernetes等。了解并掌握这些趋势,可以帮助架构师设计出更适应未来的系统。 《软件体系结构...

Global site tag (gtag.js) - Google Analytics