软件架构————如何写好类中的子程序

子程序的优点:

子程序的使用时的程序变得更加易读,更加易于理解。

子程序用以节约空间和提高性能的最重要的手段。

创建子程序的理由:

1.降低复杂度:可以隐藏一些信息;当内部循环或条件判断的嵌套层次很深时,这就需要从子程序中提取新的子程序了。

2.引入中间、易懂的抽象

3.避免代码重复:事实上,如果在两段子程序内有相似的代码,就以为这代码分解有问题,应该把相似的代码提取出来,将其中相同部分放入一个基类,然后再把两段程序中的差异代码放入派生类中。

4.支持子类话:覆盖简短而规整的子程序所需新代码的数量,要比覆盖冗长邋遢的子程序更少。

5.隐藏顺序:把处理事件隐藏起来是一个好主意。

6.隐藏指针:指针操作的可读性通常都很差,而且容易出错。通过把这些操作隔离在子程序内部,就可以把经历集中于操作的意图本身,而不是指针操作机制的细节。

7.提高可移植性:可以用子程序来隔离程序中不可移植的部分,从而明确识别和隔离未来的移植工作。

8.简化复杂的布尔判断

9.改善性能

似乎过于简单而没有必要写成子程序的操作:

对于只有几行代码比较简单的子程序来说,到底有没有必要将它写出来?这个还是得根据代码编写的需求而定,如果其他函数都用到了这些代码,那么最好将其写入一个子函数中,这样在后期如果要修改的话不用到各个其他函数中修改,只要在这个简单的子函数修改即可,这样可以减少工作量。

在子程序层上设计:

对于子程序而言,内聚I型那个是指子程序中各种操作之间联系的紧密程度。而创建子程序的目标就是让一个子程序只把一件事做好,不再做任何其他事->也称为功能的内聚性!

一般来说,其他类型的内聚性都是不可取的。他们都会导致代码组织的混乱、难于调试、不变修改。如果一个子程序具有不良的内聚性,那最好还是花功夫重新编写,使其具有更好的内聚性,而不是再花精力精确地诊断问题所在了。

好的子程序名字:

好的子程序名字能清晰地描述子程序所做到的一切。

1.描述子程序所做的所有事情:子程序名字应当描述其所有的输出结果以及副作用,如果写的有一些副作用的子程序,就会引起很多又长又笨的名字。解决的方法不是使用某个描述性较弱的子程序名,而应该换一种方式编写程序,直接了当地解决问题而不是产生副作用。

2.避免使用无意义的、模糊或表达不清的动词:有时一个子程序中仅有的问题就是其名字表述不清,而子程序本身也许设计的很好;有时动词之所以模糊是由于子程序执行的操作就是含糊不清的。

3.不要仅通过数字来形成不同的子程序名字:如output1,output2,这样很难有区分度

4.根据需要确定子程序名字的长度:研究表明,变量名的最佳长度是9到15个

5.给函数命名时要对返回值有所描述:函数有返回值,因此,函数的命名要应该针对其返回值进行。

6.给过程起名时使用语气强烈的东西加宾语的形式:一个具有功能内聚性的过程通常是针对一个对象执行一种操作。

7.准确使用对仗词

8.为常用操作确立命名规则:防止一个项目中不同编程人员设定自己的函数命名,造成不同编程人员要了解其他人员的函数内部实现细节。

子程序可以写多长?

如果要编写一段超过200行代码的子程序,那就要小心了。对于超过200行代码的子程序来说,没有哪项研究发现他能降低成本和/或降低错误率,而且在超过200行后,迟早会在可读性方面遇到问题。

如何使用子程序参数:

1.按照一定的顺序组织子程序参数排序(输入-修改-输出):不要随机地或按字母顺序排列参数,而应该先列出仅作为输入用途的参数,然后是即作为输入有作为输出用途的参数,最后才是仅作为输出用途的参数。

2.考虑自己创建in和out关键字

3.如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序保持一致。

4.使用所有参数:既然往子程序中传递了一个参数,就一定要用到这个参数。

5.把状态或出错变量放在最后

6.不要把子程序的参数用作工作变量:把传入的子程序的参数用作工作变量是很危险的,应该使用局部变量。

7.在接口中对参数的假定加以说明

应该对那些接口参数的假定进行说明呢?

a参数是仅用于输入的、要被修改的、还是仅用于输出的

b表示数量的参数的单位

c如果没有枚举类型的话,应该说明状态代码和错误值的含义

d所能接受的数值范围(如32位数据溢出问题)

e不该出现的特定数值(如除数不能为零)

8.把子程序的参数个数限制在大约7个以内

9.考虑对参数采用某种表示输入、修改、输出的命名规则

10.为子程序传递用以维持其接口抽象的变量或对象:

子程序的接口要表达何种抽象?如果要表达的抽象是子程序期望3想的定的数据,但这3项数据只是碰巧由同一对象所提供的,那就应该单独传递这3项数。然而,如果子程序接口要表达的抽象是一直拥有某个特定对象,且该子程序要对这一对象执行这样那样的操作,如果单独传递3项特定的数据,那就是破坏了接口的抽象。

如果采用传递整个对象的做法,并发现自己是创建对象,把被调用子程序所需的3项数据填入该对象,在调用过子程序后又从对象中取出3项数据的值,那就是一个证据,说明应该值传递那3个数据而不是整个对象。

如果发现自己常需要修改程序的参数表,而每次修改的参数都是来自于同一个对象,那就说明应该传递整个对象而不是个别数据项了。

11.使用具名参数

12.确保实际参数与形式参数相匹配:形式参数是指在子程序中声明的变量。实际参数是指在实际的子程序调用中用到的变量、常量或表达式。

关于函数的返回值:

检查所有可能的返回路径

不要返回指向局部数据的引用或指针

时间: 2024-11-09 02:21:35

软件架构————如何写好类中的子程序的相关文章

static静态变量在c++类中的应用实例

这个static 如果写在类中,那么就可以得到一个局部的静态变量,也就是说可以实现在类内保存某个特殊值不随函数释放而消失的作用.应用中由于赋初值的位置不对而报错,错误提示为:"无法解析外部符号 ...",这里将更改之后的代码放上来: mytest_static.h #pragma once class mytest_static { public: mytest_static(); ~mytest_static(); // 记录该函数被调用的次数 int countformytest(

需求:有一个猜数字小游戏,请写一个程序实现在测试类中只能使用5次,超过5次提示:游戏试玩结束,请付费。

package cn.idcast4; import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.Reader;import java.io.Writer;import java.util.Properties; /* * 需求:有一个猜数字小游戏,请写一个程序实现在测试类中只能使用5次, *

Java---多个类写在一个类文件中

可以将多个类写在一个类文件中,但只能有一个类是public类,而且该类的类名必须和类文件名一致. 默认修饰符的类只能在它所在包的范围内使用,出了本包无效. 如: -----Test.class开始 ----- public class Test{ //todo... } class Point{ //todo... } class Circle{ //todo... } ----Test.class 结束--- Java---多个类写在一个类文件中

php中怎么导入自己写的类

如果写的类是写在当前php文件内,就直接实例化若你的类写在其他的php文件里,就要先用include或require,将类文件引入<?php include("class.php");//将目标文件包含进来 $className = new Class();//将目标类实例化 $className->show(); //这样访问目标类里面的方法.?>

Python类中实例属性的通用显示工具

0.说明 以下的思想方法非常有用,可以帮助你在Python开发提高开发和维护效率,所以可能的话,请仔细琢磨一下其中的代码. 之前在用Python编写一个类时,为了显示的友好性,总是需要在每个类中重载__str__或者__repr__方法,现在有了更好的方法,不需要在每个类中都这么做了,下面给出的方法非常实用. 下面使用的例子使用的Python版本都是Python3.5,但实际上在Python2.7中进行也没有任何影响. 1.正常情况下类实例的不友好显示 在Python中编写一个类时,由于没有重载

C++ 类中的const关键字

//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是this指针 int GetX() const //====>int GetX(const this) { //因为this被隐藏,所以const关键字只好写在函数后面 //x++; //加上const关键字 报错 error C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改 //这个

QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)

因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了.因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windows的API以及编程模式,现在要移植到Qt中,第一个要面临的问题就是如何将windows的消息机制很好的转换为Qt中的处理机制.windows中是消息,Qt中是事件和信号.槽,其实原理都是一样的. 1.常用事件 因为所有和界面相关的类都是继承自QWidget类,所以QWidget类有的时间和方法,在

回调同一个类中的函数

写了一个类处理好友,其中有一个方法用来同步好友,而这个方法中需要从微博传来的关注列表和粉丝列表中,找到互相关注的用户,记录一下经验,主要还是关于回调函数. 按照我最初的理解,这样写就可以了 private function getMutualFromSina ($focusList) { return array_filter($focusList, "filterSinaList"); } private function filterSinaList ($value) { retu

.NET CORE 2.0之 依赖注入在类中获取IHostingEnvironment,HttpContext

在.NET CORE 中,依赖注入非常常见, 在原先的 HttpContext中常用的server.Mappath已经么有了如下: HttpContext.Current.Server.MapPath("xx") 取而代之的是IHostingEnvironment 环境变量 可以通过依赖注入方式来使用,不过在大多数的情况下 我们需要在,类中使用,通过传统入的方式就不太合适,如下: 可以换一种方式来处理 新建一个类如下: public static class MyServiceProv