精华内容
下载资源
问答
  • 最小知识原则
    2015-01-13 10:51:20
    最小知识原则:例如能使用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流、数据库链接的手动关闭、释放
    更多相关内容
  • “最少知识原则

    千次阅读 2018-02-01 09:08:50
    1. 什么是最少知识原则? 最少知识(least knowledge)原则:只和你的密友谈话。 什么意思呢?就是告诉我们要减少对象之间的交互,只留下几个“密友”。 所以,当你设计一个系统时,不管是任何对象,你都要注意它所...

    前言:在学习适配器模式与外观模式时,我们会接触到这个原则。




    1. 什么是最少知识原则?
    最少知识(least knowledge)原则:只和你的密友谈话。
    什么意思呢?就是告诉我们要减少对象之间的交互,只留下几个“密友”。
    所以,当你设计一个系统时,不管是任何对象,你都要注意它所交互的类有哪些,并注意它和这些类是如何交互的。
    这个原则希望我们能够在设计中,减少类耦合,免得牵一发而动全身,使系统变得易碎、复杂、维护成本增加等。




    2. 违反该原则的例子
        public float getTemp(){
            // 这里违反最少知识原则了,因为在此调用的方法属于另一次调用的返回对象
            return station.getThermoeter().getTemperature();
        }




    3.怎样避免违反呢?
    即我们只调用以下范围的方法:
    (1)该对象本身;
    (2)被当作方法的参数而传递进来的对象;
    (3)此方法所创建或实例化的任何对象;
    (4)对象的任何组件;
    例子:
        /**
         * 反例
         * 这里,我们从气象站取得了温度计(thermometer)对象,然后在从温度计对象取得温度
         *
         * @return 温度
         */
        public float getTemp(){
            Thermometer thermometer = station.getThermometer();
            return thermometer.getTemperature();
        }
        /**
         * 正例
         * 此时我们直接在气象站加进一个方法,用来向温度计请求温度,这可以减少我们所依赖的类的数目
         *
         * @return 温度
         */
        public float getTemp(){
            return station.getTemperature();
        }




    4. 将方法调用保持在界限内

    public class Car {
    
        /**
         * 发动机(这是类的一个组件,我们能够调用它的方法)
         */
        Engine engine;
        
        public Car(){
            // 初始化发动机
        }
    
        /**
         * 例子
         * 
         * @param key key是被当作参数传递进来的对象,它的方法可以被调用
         */
        public void start(Key key){
            // 这里创建了一个新的对象,其方法可以被调用
            Doors doors = new Doors();
    
            boolean authorized = key.turns();
    
            if (authorized){
                engine.start(); // 可以调用对象组件的方法
                updateDashboardDisplay();  //可以调用同一个对象内的本地方法
                doors.lock();  //可以调用你所创建或实例化的对象的方法
            }
        }
    
        public void updateDashboardDisplay(){
            // 更新显示
        }
    }




    5. 相关问答
    (1)还有另一个原则,叫做得墨忒耳法则(law of demeter),它和最少知识原则有什么关系?
    答:它们指的是同一个原则。我们倾向于使用最少知识原则来称呼它。

    (2)采用最少知识原则有什么缺点吗?
    答:是的,虽然这个原则减少了对象之间的依赖,研究显示这会减少软件的维护成本;但是采用这个原则也会导致更多的“包装”类被制造出来,以处理和其他组件的沟通,这可能会导致复杂度和开发时间的增加,并降低运行时的性能。




    6. 外观模式和最少知识原则(外观模式中最少知识原则的体现)





    7. java中有些违反最少知识原则的例子,如

    System.out.println();


    展开全文
  • 在Linux文件管理背景知识中,我们又看到,每个文件又有九位的权限说明,用来指明该文件允许哪些用户执行哪些操作(读、写或者执行)。 (参考Linux文件管理背景知识) 一般来说,Linux的用户信息保存在/etc/passwd中,组...
  • 迪米特法则(最少知识原则

    千次阅读 2018-09-03 20:46:57
    迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least KnowledgePrinciple,LKP) 老师要求清点女学生的类图 老师只要和GroupLeader有关系就可以   软件安装过程类图演化:     迪米特法则的...

    迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least KnowledgePrinciple,LKP)

    老师要求清点女学生的类图

    老师只要和GroupLeader有关系就可以

     


    软件安装过程类图演化:

     

     

    迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用率才可以
    提高。
     

    展开全文
  • 51单片机开发原则知识介绍:尽可能让变量使用占用代码空间最小的变量类型、尽可能使用无符号类型数据、尽可能选择小的存储模式即small、当应用其他存储模式的时候尽可能将变量存储在data区域内、要知道如何在你的...
  • 最小影响原则 隔离原则 接口设计 代码重构

    【问题】
       遗留项目的维护开发中 如何避免新添加代码变成包袱?
      需要说明的是本文内容简单但是确实有点长,但是相信耐心看完的你必定会有所收获,这种重构的思路在日常工作中会特别实用,尤其适用于遗留项目的维护开发工作中。不再废话,请看以下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;
    }
    
    展开全文
  • 「设计模式 JavaScript 描述」最少知识原则「设计模式 JavaScript 描述」最少知识原则1. 减少对象之间的联系2. 设计模式中的最少知识原则3. 封装在最少知识原则中的体现 「设计模式 JavaScript 描述」最少知识原则 ...
  • 之前我们对设计模式的六大原则做了简单归纳,这篇博客是对最少知识原则进行的举例说明。 最少知识原则的意义朋友类的定义:出现在成员变量、方法的输入输出参数中的类。而方法体类内部的类不能算。 每个对象都必然会...
  • 什么是最少知识原则? 最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。本节我们主要针对对象来...
  • 知识总结:经验风险最小

    千次阅读 2020-11-24 22:16:21
    经验风险最小化与结构风险最小化 2.1 经验风险最小化(empirical risk minimization,ERM) 经验风险最小化的策略认为,经验风险最小的模型是最优的模型: (7) 当样本容量足够大时,经验风险最小化能保证有很好的...
  • Linux用户与“最小权限”原则

    千次阅读 2018-03-06 18:09:12
    随时随地阅读更多技术实战干货,获取项目源码、...给你的程序过度的权限的话,就像是吃下去下面的汉堡: 容易让人吃伤的汉堡: 过度的“权限” 总结 real/effective/saved UID/GID saved UID/GID bit “最小权限”原则
  • 通常情况下,工程师在进行单片机开关电源适配器设计时,需要同时保障电压输入最大化和能量损耗的最小化。要做到以上两点,就需要严格遵循三大设计原则,即普遍原则、二次侧电路和具体原则。下面我们就来具体看一下,...
  • km-匿名可以抵制长度为m的背景知识攻击,然而现有的匿名化算法在泛化处理时,优先选择支持度最小的位置点进行处理,未考虑泛化造成的变形度。随着m值的增大,轨迹变形度会变大。针对该问题,提出2种匿名化算法:最小变形度...
  • 本文提出一种基于最小描述长度原则的不完备数据处理方法,实例证明这种方法是有效的。R08e工具的规则提取结果证明此方法在规则的集中性和支持度方面优于粗糙集辨识矩阵方法和Conditioned mean completer方法。
  • 计算机网络知识汇总(超详细整理)

    万次阅读 多人点赞 2021-06-22 15:44:13
    为了准备期末考试,同时也是为了之后复习方便,特对计算机网络的知识进行了整理。本篇内容大部分是来源于我们老师上课的ppt。而我根据自己的理解,将老师的PPT整理成博文的形式以便大家复习查阅,同时对于一些不是很...
  • 设计原则硬核干货

    千次阅读 多人点赞 2021-05-21 22:39:44
    一篇文章帮你拿下设计模式的核心:设计原则,万字长文 以下所有的原则,都不能脱离应用场景!! 很多人都有过编写代码时候无所适从,无法写出十分优雅,高效的代码。 也有些人在翻阅设计模式的时候摸不透各种奇奇怪...
  • 1.经验风险最小化:极大似然估计(maximum likelihood estimation, MLE) 就是经验风险最小化的一个例子 当模型时条件概率分布,损失函数是对数损失函数,经验风险最小化就等价于极大似然估计 2.结构风险...
  • 这是教科书里都会讲解的,把类或模块的实现细节隐藏起来,对外只提供最小的接口,也就是所谓的『最小知识原则』。有个共识,正常的程序员能理解的代码在一万行左右。这是指在理解代码的实现细节的情况下,正常的...
  • 迪米特原则也被称为最小知识原则,他的定义 一个对象应该对其他对象保持最小的了解。 因为类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大,所以这也是我们提倡的软件编程的总的...
  • 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小最小二乘法...
  • 设计原则

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

    千次阅读 2019-12-13 14:54:29
    注:该博文是我在看了数篇知识图谱综述以及阅读了相关资料后的一个总结以及自己的相关理解。 知识图谱技术是人工智能技术的重要组成部分,以结构化的方式描述客观世界中的概念、实体及其键的关系。知识图谱提技术...
  • 一文让你彻底搞懂最小二乘法(超详细推导)

    万次阅读 多人点赞 2020-06-03 15:25:41
    最小二乘法是一种最常用的解决回归问题的方法,它通过最小化误差的平方和来寻找 拟合数据的最佳匹配函数,本文详细介绍了最小二乘法的原理,并从几何角度解释了最小二乘法的几何意义
  • 代码质量-变量的作用域最小原则与就近原则 一 变量的作用域 作用域或者可见性(visibility)指的是变量在程序内的可见和引用的范围。作用域可以看作是一种衡量变量的知名度的方法:它的名气有多大?一个作用域很小...
  • 什么是开闭原则?如何实现开闭原则

    千次阅读 2021-03-07 04:15:57
    2015-04-13 06:30:01阅读( 137 )开闭原则的解释就是:软件实体应当对扩展开放,对修改关闭,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的...
  • 最小二乘法与最佳平方逼近(简单版+例子)

    万次阅读 多人点赞 2019-05-19 15:05:09
    最小二乘法和最佳平方逼近可以说是一回事,最小二乘法主要用于离散型变量,而最佳平方逼近用于的是连续型变量。 目的都是一样,为了用一个新的函数“近似”模拟出原本的数值。 离散型:如x={1,2,3,4,5,}变量是可以...
  • 管理科学基础知识__后悔值计算

    千次阅读 2022-04-29 17:09:01
    看一个例题 某企业要投产一种新产品, 生产方案有四种,A: 新建全自动生产线, B: 新建半自动生产线, C: 购置旧生产设备... 第三步: 确定决策方案, 选择各方案最大后悔值最小的, 即方案B为正确答案。 答案 : B 
  • Java面向对象设计的六大原则

    千次阅读 2018-05-17 12:00:58
    单一职责原则——SRP开闭原则——OCP里式替换原则——LSP依赖倒置原则——DIP接口隔离原则——ISP迪米特原则——LOD单一职责原则单一职责原则的定义是就一个类而言,应该仅有一个引起他变化的原...
  • OpenCV实现最大最小距离聚类算法

    万次阅读 多人点赞 2018-05-09 16:52:19
    OpenCV实现最大最小距离聚类算法  【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/80255524  本博客提供多版本的最大最小距离聚类算法:《聚类算法-最大最小距离算法(实例+代码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,572
精华内容 28,228
热门标签
关键字:

最小知识原则

友情链接: JSJYSH.rar