重构—起名改正既有代码的统一筹划十)—简化函数调用

Flask
Script扩张提供向Flask插入外部脚本的遵从,蕴含运行3个支付用的服务器,三个定制的Python
shell,设置数据库的台本,cronjobs,及别的运转在web应用之外的命令行任务;使得脚本和种类分离;

“interface”。简单被精晓、使用的接口,是付出可以面向对象软件的要紧

Flask
Script和Flask本人的干活方式接近,只需定义和增进从命令行中被Manager实例调用的命令;

  突出的接口,只向用户展现必须突显的东西。假若叁个接口揭示了过多的细节,须要将不须求暴光的东西隐藏起来,从而革新接口的身分

法定文书档案:http://flask-script.readthedocs.io/en/latest/

  全体数据都应该隐藏起来。

1 创设并运转命令

  全数能够隐蔽的函数都应有被隐形起来。hide method、remove setting
method  

首先,创建一个Python模板运转命令脚本,可起名叫manager.py;

修改函数称呼。最简易、最重点。名称是程序写我、阅读者交换的最重要工具

在该文件中,必须有1个Manager实例,Manager类追踪全部在指令行中调用的命令和处理进程的调用运市场价格况;

  只要能分晓一段程序的效率,就活该敢于运用rename
method,将团结所掌握的东西传达给客人

Manager只有二个参数——Flask实例,也足以是2个函数或其余的归来Flask实例;

  在非常时机,修改变量名称、类名称

调用manager.run()运行Manager实例接收命令行中的命令;

函数参数:add parameter、remove parameter

#-*-coding:utf8-*-  
from flask_script import Manager  
from debug import app  

manager = Manager(app)  

if __name__ == '__main__':  
    manager.run()  

  对象技术,能够维持参数列的简练

说不上,创立并投入命令;

  preserve whole object:来自同1个对象的四个值被作为参数字传送递

有二种办法创造命令,即创办Command子类、使用@command修饰符、使用@option修饰符;

  introduce parameter object:对象不存在,创造贰个参数对象

第一种——创建Command子类

  replace parameter with method:函数参数来自该函数可获取的2个对象=》幸免传递参数

Command子类必须定义一个run方法;

  replace parameter with explicit
method:参数被用来在尺度表明式中做取舍依照

举例来说:创造Hello命令,并将Hello命令参加Manager实例;

  parameter method:为数个1般函数添加参数,将它们统一到联合

from flask_script import Manager  ,Server
from flask_script import Command  
from debug import app  

manager = Manager(app)  


class Hello(Command):  
    'hello world'  
    def run(self):  
        print 'hello world'  

#自定义命令一:
manager.add_command('hello', Hello())  
# 自定义命令二:

manager.add_command("runserver", Server()) #命令是runserver
if __name__ == '__main__':  
    manager.run()  

警告:

举行如下命令:

  并发编制程序往往须要选拔较长的参数列,能够确定保证传递给函数的参数都以不可修改的。

python manager.py hello
> hello world

    例如:内置对象、值对象自然是不可变的

 python manager.py runserver 
> hello world

    能够选用不可变对象取代那样的长参数列。但必须对此类重构保持谨慎

第二种——使用Command实例的@command修饰符

separate query from
modifier:鲜明地将“修改对象情状”的函数和“查询对象情况”的函数分开设计

#-*-coding:utf8-*-  
from flask_script import Manager  
from debug import app  

manager = Manager(app)  

@manager.command  
def hello():  
    'hello world'  
    print 'hello world'  

if __name__ == '__main__':  
    manager.run()  

replace constructor with factory
method:不须要领悟搞糟函数要开创的对象属于哪个类

该情势创设命令的周转格局和Command类成立的运营格局同样;

encapsulate downcast:将向下转型封装隐藏起来,防止让用户做那种动作

python manager.py hello
> hello world

replace error code with exception:以错误代码表示程序非凡

第三种——使用Command实例的@option修饰符

replace exception with test:测试

复杂处境下,提议使用@option;

 

能够有七个@option选项参数;

一.rename method:修改函数名

 

题材:函数的名称不可能揭露函数的用途

from flask_script import Manager  
from debug import app  

manager = Manager(app)  

@manager.option('-n', '--name', dest='name', help='Your name', default='world')    #命令既可以用-n,也可以用--name,dest="name"用户输入的命令的名字作为参数传给了函数中的name
@manager.option('-u', '--url', dest='url', default='www.csdn.com')  #命令既可以用-u,也可以用--url,dest="url"用户输入的命令的url作为参数传给了函数中的url

def hello(name, url):  

'hello world or hello <setting name>'  
    print 'hello', name  
    print url  

if __name__ == '__main__':  
    manager.run()  

化解:修改函数名号

运营格局如下:

起名 1

python manager.py hello
>hello world
>www.csdn.com

动机:

python manager.py hello -n sissiy -u
www.sissiy.com
> hello sissiy
>www.sissiy.com

  提倡的编制程序风格:将复杂的处理进程分解成小函数

python manager.py hello -name sissiy -url
www.sissiy.com
> hello sissiy
>www.sissiy.com

    做倒霉=》费尽周折,却弄不驾驭这个小函数各自的用处

 

    消除重点:给函数起个好名字。准确表明它的用处(将函数上的诠释变成函数名称)

 

  八个函数名称不能够很好发挥其用途,应该立即修改。

 

    代码首先是为人写的,其次才是为总结机而写。而人需求美貌命名的函数

 

    起个好名称并不便于,须求经验。要想变成一个着实的编制程序高手,起名的程度根本,函数签名中的其余部分也一致非同一般

 

  假设重新安顿参数顺序,能够进步代码的清晰度,大胆去做。可利用add
parameter、remove parameter

做法:

  检查函数签名:是不是被超类、子类完毕过。

    是:针对每份达成各自进行下列步骤

  声澳优(Ausnutria Hyproca)个新函数,将其命名字为新名称。将旧函数的代码复制到新函数中,实行适宜调整

  修改旧函数,让其调用新函数

  找出旧函数的持有引用点,改而调用新函数

  删除旧函数

    借使旧函数是此类public接口的一局地,恐怕无法安然地删除它。那种场所下,将其保存在原处,并标记为deprecated(不提出采纳)

留意:添加、去除有些参数,进度差不多相同

 

二.add parameter:添加参数

题材:有些函数必要从调用端获得越来越多音信

解决:为此函数添加二个指标参数,让该指标带进函数所需消息

起名 2

动机:

  必须修改三个函数,修改后的函数须求某个千古从未有过的信息=》需求给该函数添加一个参数

  不选用本重构的火候:除了充足参数外,还有此外的选择

    只要大概,其余选项都比拉长参数要好:不会追加参数列的长短

    过长的参数列是bad smell:程序员很难记住这么多参数=》data clumps

    提问:

      一.能从已有参数中获取须要的新闻?

      二.能由此某些函数提供所需音信?

      三.亟需将这一个消息用于何处?此函数是还是不是相应属于用改该新闻的哪位指标拥有

      4.针对现有参数,参加新参数是或不是妥善?是还是不是能够使用intruduce
parameter object

    并非相对不要添加参数。可是,在拉长参数在此之前须求求打听其余选拔

做法:类似add parameter、remove parameter

  检查函数签名是还是不是被超类、子类实现过?是:针对每份分别达成下列步骤

  声惠氏(WYETH)个新函数。名称与原函数同,只是添加新参数;将旧函数的代码复制到新函数中

    假若急需添加的参数不止二个,将其二遍性拉长进去相比不难

  修改旧函数,令其调用新函数

    能够给参数提供任意值。1般会给目的参数提供null;给内置型参数提供一个威名昭著非符合规律值;数值型参数,建议使用0以外的值,那样比较易于将其认出来

  找出旧函数的拥有引用点,将其修改为对新函数的引用,删除旧函数

    若是旧函数是此类public接口的一部分,恐怕不可能安全地删除它。那种情状下,将其保存在原处,并标记为deprecated(不提出使用)

 

三.remove parameter:移除参数

题材:函数本体不再须求有些参数

消除:将该参数去除

起名 3

动机:

  大概时时添加参数,却往往不情愿去掉它们:无论怎么着,多余的参数不会挑起其余难点,而且事后或然用得上

    恶魔的抓住

    参数代表着函数所需的消息,分裂的参数值有两样的意思。

    函数调用者必须为每1个参数操心该传什么东西进去。借使不去掉多余参数,正是让每一种人用户多费1份心。很不划算,且“去除参数”是分外不难的一项重构

  多态函数,景况有所分裂,不能够去除原有函数:恐怕多态函数的另一份(或多份)完结会动用那个参数,此时就不能够去除它。

 

 

  

 

 

      

 

 

  

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图