精华内容
下载资源
问答
  • 意图导向编程

    2019-09-27 16:03:09
    意图导向编程”,Programming by Intention,也称目的导向编程/自顶向下编程. 其基本思想是: 每一个问题都可以分解成一系列的功能性步骤,在写代码的过程中,会按照顺序有意识的去完成每一个步骤;而意图导向编程则...

    1.1 基本思想

    “意图导向编程”,Programming by Intention,也称目的导向编程/自顶向下编程.
    其基本思想是:
    每一个问题都可以分解成一系列的功能性步骤,在写代码的过程中,会按照顺序有意识的去完成每一个步骤;而意图导向编程则是先假设每一个步骤都有一个理想的方法来完成,而不关注每个步骤的具体实现,在这种情况下,需要关心的是每个方法的输入参数,返回值以及什么样的名字最符合它的含义

    例如,创建一个服务,它接受一个业务交易,然后提交,具体的需求如下:

    • 交易信息开始于一串标准的ASCII字符串。
    • 这个信息字符串必须转换成一个字符串的数组,数组存放的值是此次交易用到的领域语言(domain language)中所包含的词汇元素(token)。
    • 每一个词汇元素必须标准化(第一个字母大写,其余字母小写,空格和非字符数字的符号都要删掉)。
    • 超过150个词汇元素的交易,应该采用不同于小型交易的方式(不同的算法)来提交,以提高效率。
    • 如果提交成功,API方法返回true,否则返回false。

    基于“意图导向编程”的思想,我们假设有一个类,类中有一个API实现上面的服务:

    public class Transaction{
        public Boolean commit(String command){
            Boolean result = true;
            String[] tokens = tokenize(command);
            normalizeTokens(tokens);
            if(isALargeTransaction(tokens)){
                result = processLargeTransaction(tokens);
            }else{
                result = processSmallTransaction(tokens);
            }
    
            return result;
        }
    }

    commit()方法是程序API,用于提供服务,而其他方法(tokenize()、normalizeTokens()、isALargeTransaction()、processLargeTransaction()、processSmallTransaction())都不属于这个对象API,仅仅是实现过程中的功能性步骤,称之为“辅助方法”(helper methods),暂时可以将他们视为私有方法。

    通过这样的编码方式,可以将精力集中在如何分解最终目标,以及那些全局性的问题上。
    并且这种实现方式,与直接把所有代码写到一个很长的方法里相比并没有增加工作量,不同点在于思考的方式和编码的顺序(先理清整体流程,再深入细节)。

    1.2 优点

    如果遵循意图导向编程,那么代码将会:

    • 更加内聚(职责单一)。
    • 更加可读和清晰
    • 更易于调试
    • 更易于重构和优化
    • 更易于单元测试
    • 更易于维护
    • 创建的方法更容易从一个类移动到另一个类
    • 更容易应用设计模式

    1.2.1 方法的内聚性

    代码的质量标准之一就是内聚性。
    以类为例,每个类都应该根据职责来定义,并且应该只有一个职责。类内部包括方法、状态以及与其他对象之间的关系,如果各个方面都紧密相关,并且围绕着这个类的唯一职责,则说这个类的内聚性很强。

    如果一个方法只实现整体职责中一个单独的功能点,则说这个方法的内聚性很强。

    人的思维方式是单线程的,当进行“多任务”的时候,实际上是在多个任务之间快速切换而已,人们仍旧习惯于一次只思考一件事情。意图导向编程正是利用这一事实,用思维链条单一性的特定去创建同样具备单一性的内聚方法。

    1.2.2 可读性和表达性

    通过阅读最初的实例代码:

    public class Transaction{
        public Boolean commit(String command){
            Boolean result = true;
            String[] tokens = tokenize(command);
            normalizeTokens(tokens);
            if(isALargeTransaction(tokens)){
                result = processLargeTransaction(tokens);
            }else{
                result = processSmallTransaction(tokens);
            }
    
            return result;
        }
    }

    可以发现该服务的实现流程是:
    获取到一个指令,然后对指令进行分词,再把分词后得到的指令标准化,判断需要进行交易处理的类型,根据判断结果来决定进行大型事务还是小型事务的处理,最后返回结果。

    因为上面的代码只涉及到“做什么”,而不是具体的“如何做”,这种情况下,不需要注释也能读懂代码的基本逻辑,这得益于规范的命名和步骤的清晰界定。

    考虑下面的实现方式:

    public class Transaction{
        public Boolean commit(String command){
            Boolean result = true;
    
            // tokenize the string
            some code here
            some more code here
            even some more code here that sets tokens
    
            // normalize the tokens
            some code here that normalize tokens
            some more code here that normalize tokens
            even some more code here that normalize tokens
    
            // see if you have a large transaction
            code that determines if you have a large transaction
            set lt = true if you do
                if(lt){
                    // process large transaction
                    some code here to process large transaction
                    some more code here to process large transaction
                }else{
                    // process small transaction
                    some code here to process small transaction
                    some more code here to process small transaction
                }
    
            return result;
        }
    }

    上面的实现方式是将所有逻辑写在一个大方法中,并且加了详尽的注释,但与意图导向编程的实现方式相比,注释显得很没有必要,并且代码太多,给人的心理无形中造成一种压力。

    1.2.3 调试

    在程序的代码错误修复过程中,寻找错误所在才是最花时间的。在遵循意图导向编程时,由于一个方法只做一件事,这个时候,如果出现错误,则可试试下面的办法:

    • 通读一遍整个方法,看看所有事情是怎么运作的
    • 对无法正常工作的部分,检查辅助代码的细节有什么问题

    相比于费力的查阅一大段复杂的代码,这种调试方法发现代码错误的速度要快很多。

    1.2.4 重构和增强

    重构系统:保持系统行为不变的情况下,更改它的结构。
    增强系统:增加或修改系统的行为以符合新的需求。

    重构通常认为是“清理”系统中写得糟糕的代码,重构的一个基本实现方式是:把一部分代码从一个巨大的方法中抽取出来,放到一个属于它自己的新方法中,而在原来代码中的那个位置直接调用这个新方法。

    由于原来方法的一部分临时变量也需要迁移到新方法中,所以需要多个步骤才能完成一个函数的提炼。

    如果采用意图导向编程,一开始就是辅助方法了,只需要把公用的辅助方法迁移到其他类即可。这样的重构是很快的(复制-粘贴)。

    当系统实现后,有新需求加进来了,如:与第三方程序交互时,由于第三方程序的原因,不再支持某些旧版词汇,这个时候需要更新一个词汇元素,如:

    public class Transaction{
        public Boolean commit(String command){
            Boolean result = true;
            String[] tokens = tokenize(command);
            normalizeTokens(tokens);
        updateTokens(tokens);
            if(isALargeTransaction(tokens)){
                result = processLargeTransaction(tokens);
            }else{
                result = processSmallTransaction(tokens);
            }
    
            return result;
        }
    }

    有新需求加进来的时候,只需要在API方法的实现流程中增加updateTokens()方法,其他都不需要修改到,把影响降到了最低。

    如果修改了标准化的算法,则更改normalizeTokens()方法即可,其他都无需改动。在修改的过程中,代码能很快定位。

    1.2.5 单元测试

    设计的基本建议:使用服务的客户端,在设计时应该遵照的是服务的接口定义,而不是服务的具体实现。
    在上面的实现中,辅助方法被定义成了私有方法,是为了不想与外部对象发生关联,但这种情况下就不利于方法的单元测试。
    我们只能对commit()方法进行单元测试,即测试服务的整体行为。此时测试情况比较复杂,会有很多种因素导致测试失败。
    可以有如下解决办法:

    • 如果辅助方法只是实现单个服务的一部分,则没必要单独测试辅助方法,测试这个服务流程即可。
    • 如果某些辅助方法是能被其他服务使用到的,则需要将该辅助方法单独到其他的类中,并且定义成公有的方法,则对原来辅助方法的调用就变成了对新类方法的调用,并且新类的公有方法是能进行单元测试的。

    1.2.6 可迁移的方法

    为了提高类的内聚性,需要把这个类不应该有的方法迁移到其他类中,这样可以让这个类所关注的东西减少。

    意图导向编程创建的方法只完成一个功能,这样避免了迁移方法是经常遇到的问题:包含不能迁走的部分。
    当一个方法只做一件事时,要么全部迁移,要么不迁移。

    方法迁移难,还可能由于它直接关联到了类中的状态变量,在使用意图导向编程时,习惯于将参数传递到辅助方法,然后获取一个返回结果,而不是让方法直接使用对象的状态。

    1.2.7 易于修改和扩展

    从之前的重构和增强可看成,当增加需求时,只需要在流程中增加对应的辅助方法;
    当需要修改需求时,只需要修改对应的辅助方法。这种修改和扩展容易定位并且不影响其他代码。

    1.2.8 在代码中发现模式

    上面的例子中,如果有两个不同的交易类型,流程步骤一样(分词、标准化、更新、处理),但每一步的实现方式不一样。
    使用意图导向编程时,处理每个辅助方法具体实现不一样,commit()方法是一样的,这个时候,可以很容易的应用模板方法模式

    转载于:https://www.cnblogs.com/Jxwz/p/8393042.html

    展开全文
  • 解析重构利器与意图导向编程规范 解析重构利器与意图导向编程规范
  • 我们曾用的意图导向编程 写程序时,我们常会这么做:先定义主方法框架:在方法中定义几个空的子方法1、子方法2、汇总方法等,然后分别实现它们。对我来说,这是个屡试不爽办法。 先关注整体,得到框架;再关注局部...

    我们曾用的意图导向编程

    写程序时,我们常会这么做:先定义主方法框架:在方法中定义几个空的子方法1、子方法2、汇总方法等,然后分别实现它们。对我来说,这是个屡试不爽办法。

    先关注整体,得到框架;再关注局部,实现细节。这种编程方法,就是敏捷技能中“意图导向编程”的雏形。

     

    通过拜读敏捷大师们的总结,可以提升我们实践的效率和对问题理解的深度。以后,子方法和汇总方法的命名我会仔细斟酌,尽量做到不用注释也可以清晰明了。

     

    “意图导向编程”的主体思想

    1. 首先将问题分解为一系列的功能性步骤,以需求条目的形式依次列出。(在写代码的过程中,我们会按照一定的顺序,有意识的去完成每一点要求。)

    2. 在意图导向编程中,先假设当前这个对象中,已经有了一个理想的方法,它可以准确无误的完成你想做的事情,而不是直接盯着每一点要求来编写代码。

      先问问自己:“假如这个理想的方法已经存在,它应该具有什么样的参数,返回什么值?还有,对我来说,什么样的名字最符合它的意义?”

       因为这个方法并没有实际存在,所以除了你自己的最终意图之外,没有任何其他东西的约束(因此,你是“意图在主导编程”)。

    3. 试试写出解决问题的方法代码,然后依次实现其中假设的一个个理想方法。

     

    “意图导向编程”实践的优点

    1. 方法的内聚:更加内聚(单一指责)。

    2. 可读性和表达性:更加可读和清晰。

    3. 调试:更易于调试。

    4. 重构和增强:更易于重构和优化,所以只做最少的设计,满足当前需求;同样易于修改和扩展。

    5. 测试:更易于单元测试。

    6. 易于在代码中发现模式。

    7. 方法易迁移,代码易维护。

    转载于:https://www.cnblogs.com/marshal-m/archive/2013/05/28/3104774.html

    展开全文
  • 更加内聚(单一职责)。...更加可读和清晰(自顶向下的编程,主流程很清晰,层次感很好)。 更容易调试(更容易定位错误)。 更容易重构和优化。 更容易单元测试。 更容易应用模式。 更容易维护。 ...
    • 更加内聚(单一职责)。
    • 更加可读和清晰(自顶向下的编程,主流程很清晰,层次感很好)。
    • 更容易调试(更容易定位错误)。
    • 更容易重构和优化。
    • 更容易单元测试。
    • 更容易应用模式。
    • 更容易维护。
    展开全文
  • 意图导向编程即自顶向下编程,其思想为:先假设当前这个对象中,已经有了一个理想方法,它可以准确无误的完成你想做的事,而不是直接盯着每一点要求来编写代码。编写前先问问自己:“假如这个理想方法已经存在,它...


                   意图导向编程即自顶向下编程,其思想为:先假设当前这个对象中,已经有了一个理想方法,它可以准确无误的完成你想做的事,而不是直接盯着每一点要求来编写代码。编写前先问问自己:“假如这个理想方法已经存在,它应该具有什么样的输入参数,返回什么值?还有,什么样的命名最符合他的意义”.

                  以一实例要求:

                        1、交易信息开始于一串标准ASCII字符串;


                       2、这个信息字符串必须转换成一个字符串数组,数组存放的值是此次交易用到的领域语言中所包含的吃会元素;


                      3、每个词汇必须标准化(第一个大写,其余小写,空格和非字母数字的符号都要删除);


                     4、包含超过150个词汇元素的交易,应该采用不同于小型交易的方式(不同的算法)来提交,以提高效率;


                     5、如果提交成功,API方法应该返回“true”,失败返回“false”;



    public  class Transaction{
        public  Boolean commit(string command){
            Boolean result = true;
            string[] tokens = tokensize(command);
            normalizeTokens(tokens);
            if(isALargeTransaction(tokens)){
             result = processLargeTransaction(tokens);
           }else{
            result = processSmallTransaction(tokens);     
          }       
          return result;
    
      }
     }   


               其中commit()方法为我们为这个对象提供的应用程序API;里面的方法都还没有实现,编译后,编译器会提示错误,找不到那些辅助方法,接下来就是要创建内部相应的方法。 这种编码方式可以说很常见,一般我在写程序的时候就是这样思考程序的框架的,但并没有具体的按照该方法,仅仅只是想想而已,然后就去写相应的“辅助方法”,我这样的编码方式往往造成很多问题,一、对程序的大体框架仅仅只是了解,并不是很明确,设计中常常因为考虑不周全而需要改变;二、对“辅助方法”的命名不能准确的确定,造成编码过程中因为新想法出现了混乱。 

            而采用“意图导向编程”的编码方式,在编程开始假设这些“辅助方法”都已经存在,我只需先考虑这些“辅助方法”要实现的功能和他们的输入和输出,然后按程序要求写出这程序的主框架,确定了主框架,后面就只是“辅助方法”的编程,这种方法使得我在整个编程中思路非常清晰,而且其功能单一。对于代码的重构和优化,测试都提供和很大的便利。 在这一章中还提到了代码的重构,意图导向编程的创建方法只有一个功能,在代码迁移过程中比较容易,因为其只完成单一功能,迁移过程中只需把整个部分一走就行。





    展开全文
  • 2.14.2 意图导向编程 在编写代码前,先写测试代码,更容易提高 关注点 。 因为,在开发过程中, 大多时候会被外界打断(如需求沟通、线上问题处理、临时会议等),而通过单元测试则可以让你“几乎忘却...
  • class="journal-title">敏捷技能修炼之小舵板之意图导向编程 class="author">     class="the-article">   id="section">前言   最近想学习敏捷开发,在看一本书,叫《敏捷技能修炼-...
  • 首先一个敏捷方法是极限编程,或者简写为XP。在千禧年之初得到了很多的关注。XP倡导的许多核心方法在本书中都有所展示且是很好的敏捷方法的代表。 1.3.1质量和范围 在书籍Extreme Programming Explained, Kent ...
  • 摘要:本文将介绍一种用于防止返回导向编程(ROP)攻击的技术,称之为ROPGuard。ROPGuard在2012年Black Hat USA的微软BlueHat奖竞赛中获得二等奖(https://www.microsoft.com/security/bluehatprize/)。 该技术不需要...
  • 你的价值观决定你的性格,习惯,做事风格。以下是我的一些价值观练习的导图。 1:言出必行(大家都是成年人了,应该要对自己说的话负责了。) ...2:诚信负责(就算有错才要错下去,执行下去要有结果。...
  • 在 Objective-C 中,关于剖面导向编程有一个误解:苹果官方并不支持剖面导向编程。 不是的。 Objective-C 中的 Key-Value Observation 就是一个特设的剖面导向编程框架,并且这是由苹果带来的官方特性。我们可以...
  • 这样的名称纯属误导——完全没有提供正确信息,没有提供导向作者意图的线索。试看: public static void copyChars(char a1[], char a2[]) { for (int i = 0; i ; i++) { a2[i] = a1[i]; }} 如果参数名改为source和...
  • 重新思考结对编程

    2020-04-24 01:08:05
    配对编程陷阱 在专业环境中,与具有不同软件开发基础的开发人员结对可能会很慢,很累而且很沮丧。 让我们探讨一些配对编程的陷阱。 结对编程可能会缓慢而令人沮丧 必须对每个变量名称进行解释并达成共识可能会...
  • 研究人员发现,当老鼠控制光标时,大脑高级视觉皮层的活动是目标导向的,包含有关动物意图的信息。这项研究有一天将有助于改善BMI的设计。 脑机接口允许人或动物用意念控制电脑的设备。对人类来说,这可能是控制机械...
  • 计算机编程 常用术语英语词汇大全 记忆

    万次阅读 多人点赞 2017-04-14 15:13:21
    第二部分、编程词汇 A2A integration A2A 整合 abstract 抽象的 abstract base class (ABC) 抽象基类 abstract class 抽象类 abstraction 抽象、抽象物、抽象性 access ...
  • 尽管之前已经有100天、200天、365天的文章,但是这不是一篇象征性的500天的文章。对这样的一个事物,每个人都会有不同听看法。...编程的情绪周期 有意图的练习 那么,当我们不断地练习的时候,我们就可以写出更好的代码
  • 意图打开数据科学的大门但却不知怎么开始?那就看一看我们整理出的10种在数据科学家和数据分析师眼中这些热门的语言和工具。 R语言 R语言是数据科学家和分析师们常用的两种顶级工具中的一种。1995年 Ross Ihaka 和 ...
  • 计算机编程英语词汇大全

    千次阅读 多人点赞 2018-10-17 22:09:53
    API (Application ProgrammingInterface) 应用(程序)编程接口 app domain (application domain)应用域 application 应用、应用程序 application framework 应用程序框架 appearance 外观 append 附加 ...
  • 21世纪,计算机的应用越来越多,为了适应各种使用场景,于是诞生了各种语言,不仅语言是...编程语言是靠“适者生存,优胜劣汰”的“编程语言进化论”来发展的,也许A语言的创造初衷也是为了打造适应性超强的万能语...
  • 意图导向编程:把处理某件事的流程和具体做事的实现方式分开。 把一个问题分解为一系列功能性步骤,并假定这些功能步骤已经实现 我们只需把把各个函数组织在一起即可解决这一问题 在组织好整个功能后,我们在分别...
  • 意图导向编程:把处理某件事的流程和具体做事的实现方式分开。 把一个问题分解为一系列功能性步骤,并假定这些功能步骤已经实现 我们只需把把各个函数组织在一起即可解决这一问题 在组织好整个功能后,我们在分别...
  • 意图导向编程:把处理某件事的流程和具体做事的实现方式分开。 把一个问题分解为一系列功能性步骤,并假定这些功能步骤已经实现 我们只需把把各个函数组织在一起即可解决这一问题 在组织好整个功能后,我们在分别...
  • API (Application Programming Interface) 应用(程序)编程接口 app domain (application domain)应用域 application 应用、应用程序 application framework 应用程序框架 appearance 外观 append 附加 ...
  • 1.1 编程语言简述 1.1.1 编程语言是什么 所谓编程语言只是一个抽象的规范,而编译器是这个规范的实现,它是在这个规范的严格定义下被实现的. 打个比方,这个语言规范,就像是一份制造汽车的图纸,他规定了汽车应该有...
  • 计算机英语(编程词汇大全)

    千次阅读 2018-12-13 13:32:53
    计算机英语(编程词汇大全) 来源地址:https://blog.csdn.net/D_hj05/article/details/80274471 application [ˌæplɪ'keɪʃ(ə)n]应用程式 应用、应用程序 application framework['freɪmwɜːk] 应用程式框架...
  • 计算机编程词汇

    2019-03-28 09:18:22
    API (Application ProgrammingInterface) 应用(程序)编程接口  app domain (application domain)应用域  application 应用、应用程序  application framework 应用程序框架  appearance 外观  append...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,061
精华内容 824
关键字:

意图导向编程