精华内容
下载资源
问答
  • 最小知识原则:例如能使用private不使用public,对于实体之外的其他对象可见性最小 变量作用域最小化原则: 例如能使用局部变量不使用全局变量,JAVA垃圾回收器能够在最快时间内回收该变量 避免相同对象...
    最小知识原则:例如能使用private不使用public,对于实体之外的其他对象可见性最小
    


    变量作用域最小化原则:
    例如能使用局部变量不使用全局变量,JAVA垃圾回收器能够在最快时间内回收该变量


    避免相同对象的重复创建:例如for循环需创建新对象,对象的创建置于循环外


    堆变量、栈变量:
    变量的创建尽量置于方法体内,
    尽量减少方法调用次数(例如for循环,尽量避免for(int i=0;i<list.size();i++)类似操作,改为for(int i=0,length=list.size();i<length;i++)),
    减少非必要static变量的创建,避免非必要变量或实体在内存常驻
    IO、DB等操作时IO流、数据库链接的手动关闭、释放
    展开全文
  • 最小影响原则 隔离原则 接口设计 代码重构

    【问题】
       遗留项目的维护开发中 如何避免新添加代码变成包袱?
      需要说明的是本文内容简单但是确实有点长,但是相信耐心看完的你必定会有所收获,这种重构的思路在日常工作中会特别实用,尤其适用于遗留项目的维护开发工作中。不再废话,请看以下C语言代码片段:


    /*
     * Source file main.c
    */ 
    #include <stdio.h>
    #include <stdlib.h>
    #include "method.h"
    
    int main()
    {
        int c = method_one_param("Something needs to be done with only one input parameter!");
    	if (0 != c)
    	    exit(c);
        return 0;
    }
    
    /*
     * Header file method.h
    */ 
    #ifndef _METHOD_H_
    #define _METHOD_H_
    extern int method_one_param(char *);
    #endif /* _METHOD_H_*/
    
    /*
     * Source file method.c
    */ 
    #include "method.h"
    int method_one_param(char *str)
    {
        int ret = 0;
        // step one
    	// step two
    	// step three
    	// ...
    	// other steps
    	return ret;
    }
    

      显而易见,main()函数中我们调用仅包含一个char*类型入参的函数method_one_param()来完成某一逻辑。现在有一个新的需求,需要在main()函数中依据一个bool类型变量的值来决定被调用函数method_one_param()的执行逻辑,比如条件性的增加新的逻辑或者执行某一逻辑

    【问题分析】
      为了达到需求,我们需要针对函数method_one_param()增加一个bool变量,当该变量取值为TRUE时执行原有的代码逻辑;当该变量为FALSE时,执行新增加的逻辑。故最终的函数调用情况如下:

    /*
     * Source file main.c updated
    */ 
    #include <stdio.h>
    #include <stdlib.h>
    #include "method.h"
    
    int main()
    {
        int c = 0;
        bool isTrue = FALSE;
        if (isTrue) { /* TRUE分支保证代码原有行为 -- 调用方式改变 */
    		c = method_one_param("Something needs to be done when 'isTure = TRUE'!", TRUE);
    	} esle { /* 新增加逻辑 -- 传递一个值为FALSE类型的变量 */
    	    c = method_one_param("Any otherthing needs to be done when 'isTure = FALSE'!", FALSE);
    	}
    	if (0 != c)
    	    exit(c);
        return 0;
    }
    

      看似可以完美解决当前的问题,但假如函数method_one_param()在其他地方多次被调用,那我们是不是需要更新所有调用处,因为被调用方法增加了一个新的布尔类型变量。仔细想想你肯定遇到过很多类似情况!!!
      OK,为了避免多处更新操作,可以使用默认参数啊?听起来很不错,那就试试呗!更新代码如下:

    /*
     * Header file method.h
    */ 
    #ifndef _METHOD_H_
    #define _METHOD_H_
    extern int method_one_param(char *, bool);
    #endif /* _METHOD_H_*/
    
    /*
     * Source file method.c updated
    */ 
    #include "method.h"
    int method_one_param(char *str, bool isAllowed = TRUE)
    {
        int ret = 0;
        // step one
    	// step two
    	if (isAllowed)
    	    // step three
        else
            // new added step
    	// ...
    	// other steps
    	return ret;
    }
    
    /*
     * Source file main.c updated
    */ 
    #include <stdio.h>
    #include <stdlib.h>
    #include "method.h"
    
    int main()
    {
        int c = 0;
        bool isTrue = FALSE;
        if (isTrue) { /* 原有逻辑未作任何改变 -- 调用方式 */
    		c = method_one_param("Something needs to be done when 'isTure = TRUE'!");
    	} esle { /* 新增加逻辑,传递一个值为FALSE类型的变量 */
    	    c = method_one_param("Any otherthing needs to be done when 'isTure = FALSE'!", FALSE);
    	}
    	if (0 != c)
    	    exit(c);
        return 0;
    }
    

      接下来编译程序,很意外的出现以下错误提示:

    ../method.c(5) : error C2143: syntax error : missing ')' before '='
    ../method.c(5) : error C2072: 'method_one_param' : initialization of a function
    ../method.c(5) : error C2059: syntax error : ')'
    ../method.c(6) : error C2143: syntax error : missing ';' before '{'
    ../method.c(6) : error C2449: found '{' at file scope (missing function header?)
    ../method.c(6) : error C2059: syntax error : '}'
    gmake[1]: *** [../method.obj] Error 2
    gmake[1]: Leaving directory `../../test'
    

      错误提示大概意思是:在函数method_one_param(char*, bool)定义处存在问题,有点莫名其妙!如何排查问题?既然因为默认参数的引入导致的,那我们是否需要确认下C语言默认参数的相关知识?最终的答案是:C语言不支持默认参数

    【解决方法】
      一个可行的方案:基于原始被调用方法method_one_param(),增加一个新的布尔类型的参数isAllowed,命名为新的静态方法method_internal(char *, bool),其内部逻辑仅仅是依据参数isAllowed稍加改动而已,也就是说新的静态方法是原有被调用方法的条件版本。这样做的好处是:原始被调用方法只需要更新函数体,以特定的isAllowed值调用新的静态方法,也就是对原有的代码逻辑没有任何影响。

    /*
     * Header file method.h
    */ 
    #ifndef _METHOD_H_
    #define _METHOD_H_
    extern int method_one_param(char *);
    extern int method_one_param_with_option(char *);
    
    static int method_internal(char *, bool);
    #endif /* _METHOD_H_*/
    
    /*
     * Source file method.c
    */ 
    
    /* 基于method_one_param()的实现逻辑新增加的静态方法 */
    static int method_internal(char *str, bool isAllowed)
    {
        int ret = 0;
        // step one
    	// step two
    	
    	if (isAllowed)
    	    // step three
        else
            // new added step
      
    	// step four
    	// ...
    	// other steps
    	return ret; 
    }
    
    
    /* 用'isAllowed = TRUE'来调用新增加的静态方法,以此保证原始方法行为未做变更 */
    int method_one_param(char *str)
    {
        return method_internal(str, TRUE);
    }
    
    /* 为新的需求而增加的方法 */
    int method_one_param_with_option(char *str)
    {
        return method_internal(str, FALSE);
    }
    
    /*
     * Source file main.c
    */ 
    int main()
    {
        bool isTrue = FALSE;
    	int c = 0;
    	if (isTrue) { /* 原始的方法调用未有任何改变 */
    		c = method_one_param("Something needs to be done when 'isTure = TRUE'!");
    	} esle { /* 新的需求对应的逻辑 */
    	    c = method_one_param_with_option("Any otherthing needs to be done when 'isTure = FALSE'!");
    	}
        
    	if (0 != c)
    	    exit(c);
        return 0;
    }
    
    展开全文
  • 什么是最少知识原则? 最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。本节我们主要针对对象来...

    什么是最少知识原则?

    最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。本节我们主要针对对象来说明这个原则,下面引用《面向对象设计原理与模式》一书中的例子来解释最少知识原则:

    某军队中的将军需要挖掘一些散兵坑。下面是完成任务的一种方式:将军可以通知上校让他叫来少校,然后让少校找来上尉,并让上尉通知一个军士,最后军士唤来一个士兵,然后命令士兵挖掘一些散兵坑。

    这种方式十分荒谬,不是吗?不过,我们还是先来看一下这个过程的等价代码:

    gerneral.getColonel( c ).getMajor( m ).getCaptain( c ) .getSergeant( s ).getPrivate( p)
    

    让代码通过这么长的消息链才能完成一个任务,这就像让将军通过那么多繁琐的步骤才能命令别人挖掘散兵坑一样荒谬!而且,这条链中任何一个对象的改动都会影响整条链的结果。

    减少对象之间的联系

    单一职责原则指导我们把对象划分成较小的粒度,这可以提高对象的可复用性。但越来越多的对象之间可能会产生错综复杂的联系,如果修改了其中一个对象,很可能会影响到跟它相互引用的其他对象。对象和对象耦合在一起,有可能会降低它们的可复用性。在程序中,对象的“朋友”太多并不是一件好事,“城门失火,殃及池鱼”和“一人犯法,株连九族”的故事时有发生。

    最少知识原则要求我们在设计程序时,应当尽量减少对象之间的交互。如果两个对象之间不必彼此直接信,那么这两个对象就不要发生直接的相互联系。常见的做法是引入一个第三者对象,来承担这些对象之间的通信作用。如果一些对象需要向另一些对象发起请求,可以通过第三者对象来转发这些请求。

    设计模式中的最少知识原则

    • . 中介者模式
    • 外观模式

    封装在最少知识原则中的体现

    封装在很大程度上表达的是数据的隐藏。一个模块或者对象可以将内部的数据或者实现细节隐藏起来,只暴露必要的接口API供外界访问。对象之间难免产生联系,当一个对象必须引用另外一个对象的时候,我们可以让对象只暴露必要的接口,让对象之间的联系限制在最小的范围之内。

    同时,封装也用来限制变量的作用域。在JavaScript中对变量作用域的规定是:

    • 变量在全局声明,或者在代码的任何位置隐式申明(不用var),则该变量在全局可见;
    • 变量在函数内显式申明(使用var),则在函数内可见。

    把变量的可见性限制在一个尽可能小的范围内,这个变量对其他不相关模块的影响就越小,变量被改写和发生冲突的机会也越小。这也是广义的最少知识原则的一种体现。

    展开全文
  • 代码质量-变量的作用域最小原则与就近原则 一 变量的作用域 作用域或者可见性(visibility)指的是变量在程序内的可见和引用的范围。作用域可以看作是一种衡量变量的知名度的方法:它的名气有多大?一个作用域很小...

    代码质量-变量的作用域最小化原则与就近原则

    一 变量的作用域

    作用域或者可见性(visibility)指的是变量在程序内的可见和引用的范围。作用域可以看作是一种衡量变量的知名度的方法:它的名气有多大?一个作用域很小的变量只能在很小的范围内可见-比如说,循环下标变量只能用于一个循环的小范围内,一个作用域大的变量则在程序的很多地方都是可见的-比如说全局变量。

    变量可以只对某一个代码块可见、也可以对子程序、类或者整个程序可见。

    二 作用域最小化

    那些介于同一个变量多个引用点之间的代码可称为“攻击窗口”。这个攻击窗口越分散,引起错误的可能性就越高,对它的可控制性就越差,如可能会有新代码加到这种窗口中,不当地修改了这个变量,或者阅读代码的人可能会忘记该变量应有的值。

    一般而言,应使变量的作用域最小化,把变量引用点尽可能集中在一起,从而能够对变量施加控制。将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。

    以下是一些可以用来减小作用域的特别有用的原则。

    1、在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量。

    2、直到变量即将被使用时再为其赋值。

    3、把相关语句放在一起。

    4、把相关语句组提取成单独的子程序。

    三 变量的就近原则

    就近原则(Principle of Proximity)-把相关的操作放在一起,例如让注释靠近它所描述的代码,让控制循环的代码靠近循环本身等。变量的就近原则指尽可能在靠近第一次使用变量的位置声明和定义该变量。

    就近原则实际上也是变量的作用域最小化的一种实现手段。过早地声明局部变量不仅会使它的作用域过早地扩展,而且结束得也过于晚了。局部变量的作用域从它被声明的点开始扩展,一直到外围块的结束处。如果变量在“使用它的块”之外被声明的,当程序退出该块之后,该变量仍是可见的。如果变量在它的目标使用区域之前或之后被意外地使用的话,后果将可能是灾难性的。

    有人喜欢在方法或者子程序的开始部分统一声明和定义所有的变量,如下代码示例。这种风格会产生一些问题:

    1、当使用done变量的代码开始执行的时候,done很可能已经倍修改了。即便你在第一次写这个程序的时候不会这样,后续的修改也可能会导致出现这样的错误。

    2、一旦把所有的初始化代码都放在一起,可能会让人产生误解,认为所有这些变量都会在子程序中一直使用,而事实上done知识在后面才被用到。

    3、可读性不好。当读到引用done变量的代码时,维护人员可能都忘记了done在哪里定义的,又需要在子程序里面来回搜寻变量的定义,迫使阅读者的目光在程序里跳来跳去。

    符合就近原则也就符合作用域最小化,好的代码示例如下:

      

    四 循环内局部变量代码示例

    有下面2种JAVA代码示例:

      

    根据变量的作用域最小化原则和就近原则,segment 1有较好的代码质量。

    有人仔细思考后,会提出segment 1代码的每次循环都要重新定义value,是不是意味着每次循环都要重新在栈中分配一个局部变量?是不是性能没有segment 2好?

    我们都知道在变量作用域的范围之外是不能引用这个变量的,书本上面一般都说这个变量的生存期结束了。实际上局部变量的作用域范围和生存期是语法层次上的概念。例如,在JAVA中,局部变量的大小在编译时计算出来,并放置到class文件中,然后虚拟机就能够了解到方法的栈帧需要多少内存。JAVA栈帧的局部变量区被组织为一个以字长为单位、从0开始计数的变量表数组。当虚拟机调用一个JAVA方法时,它从对应类的类型信息中得到此方法的局部变量表的大小,并据此分配栈帧内存,然后压入JAVA栈中。也就是说在方法调用之前就分配好所有的局部变量,在方法结束时随退栈操作一起释放。

    我们可以对比一下segment 1和segment 2代码的字节码:

      

    两个字节码唯一的区别在于局部变量value是否在循环之前被初始化了,局部变量表的大小由编译时决定的,都是value和i,仅仅是在变量表里的顺序不同。

    展开全文
  • 51单片机开发原则知识介绍:尽可能让变量使用占用代码空间最小的变量类型、尽可能使用无符号类型数据、尽可能选择小的存储模式即small、当应用其他存储模式的时候尽可能将变量存储在data区域内、要知道如何在你的...
  • Linux用户与“最小权限”原则 Linux的用户在登录(login)之后,就带有一个用户身份(user ID, UID)和一个组身份(group ID, GID)。在Linux文件管理背景知识中,我们又看到,每个文件又有九位的权限说明,...
  • 迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least KnowledgePrinciple,LKP) 老师要求清点女学生的类图 老师只要和GroupLeader有关系就可以   软件安装过程类图演化:     迪米特法则的...
  • “最少知识原则

    2018-02-01 09:08:50
    1. 什么是最少知识原则? 最少知识(least knowledge)原则:只和你的密友谈话。 什么意思呢?就是告诉我们要减少对象之间的交互,只留下几个“密友”。 所以,当你设计一个系统时,不管是任何对象,你都要注意它所...
  • 需求说明:Cadence基本知识 内容 :第一部分 PCB设计之3W原则  第二部分 PCB设计之3W原则与20H原则图示  第三部分 3W原则的实质详解 来自 :时间的诗 第一部分 PCB设计之3W原则 原文:...
  • 之前我们对设计模式的六大原则做了简单归纳,这篇博客是对最少知识原则进行的举例说明。 最少知识原则的意义朋友类的定义:出现在成员变量、方法的输入输出参数中的类。而方法体类内部的类不能算。 每个对象都必然会...
  • 软件设计与重构的六个原则

    千次阅读 2019-06-05 11:06:13
    软件设计与重构的六个原则 ...迪米特法则(最小知识原则) -- LOD 一、开放封闭原则 --- OCP 软件中的基础结构(函数、类或模块)对于功能扩展是开放的,但是对于修改是封闭的。 可实施的具体行...
  • 面向对象的六大原则(推荐)

    千次阅读 2012-10-07 02:56:50
    6,最小知识原则 要把软件做得非常灵活又要便于维护是一个很困难的事情。灵活的软件他的结构就复杂,维护起来就困难。有得必有失,关键就在于如何处理这两者,使得大于失。软件的设计开发应遵循以下六大...
  • 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小最小二乘法...
  • 架构设计的关键原则

    万次阅读 2012-12-20 08:19:12
    关键的设计原则 在开始设计之前,思考一下关键的原则,将会帮助你创建一个最小花费、高可用性和扩展性的架构。 ...分离关注点,将应用划分为在功能上尽可能不重复的功能点。...最小知识原则,一
  • 最小二乘法

    千次阅读 2018-11-23 14:22:14
    最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小最小二乘法...
  • OpenCV实现最大最小距离聚类算法

    千次阅读 多人点赞 2018-05-09 16:52:19
    OpenCV实现最大最小距离聚类算法  【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/80255524  本博客提供多版本的最大最小距离聚类算法:《聚类算法-最大最小距离算法(实例+代码...
  • PCB 板基础知识  一、PCB 板的元素 1、 工作层面 对于印制电路板来说,工作层面可以分为 6 大类, 信号层 (signal layer) ) 内部电源/接地层 内部电源 接地层 (internal plane layer) ) 机械层( 主要用来...
  • 利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。  通过这段...
  • 最小二乘法的线性拟合

    万次阅读 2016-06-07 16:59:50
    最小二乘法
  • 设计原则

    千次阅读 2016-03-12 15:41:25
    又叫最小知识原则,指软件实体应该尽可能少的和其他软件实体发生相互作用 小注:  迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不...
  • Spring的IOC是啥?有什么好处?

    万次阅读 2020-04-09 23:44:23
    设计模式7大原则 为什么会有人说设计模式已死呢,因为spring这些框架帮你做好了类和对象的... 最小知识原则 接口隔离原则 合成/聚合复用原则 里氏代换原则,任何基类可以出现的地方,子类一定可以...
  • 一、最小二乘法(least square method) 转自https://blog.csdn.net/suibianshen2012/article/details/51532003 1.背景 先看下百度百科的介绍:最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,003
精华内容 24,401
关键字:

最小知识原则