如果你买过一些外国的科技产品,你有可能在他们的外包装上见过这句话:
designed by ** in ***
Assembled in China 在中国组装
有一些涉及到核心机密的部件人家都是造好了,然后运到中国来,我们给组装。
关键词,组装。
各个部件可能由不同的国家负责设计生产,谁最擅长制造什么,就制造什么,最后到一个地方组装成成品。
这样做,速度最快。
这个在编程语言里经常用到。
什么是模块化
简而言之,就是你这个功能,有一部分是分出去的。像一个工程,会有一部分外包出去。你就不用管这部分怎么实现的了,反正有人帮你实现好了,你只要告诉他让他做,他就把做好的结果拿给你。
模块化有的是系统和系统的模块。不同系统间通过接口去调用别人的数据。别家的那个对你来说就是个模块化的东西。
还有的就是,同一系统不同程序的模块化,你程序A可以调用程序B的功能,程序B就相当于你的外置模块。
再有一种就是,这个程序巨大,有很多很多的功能,而有一些功能呢,在你程序执行过程中不止一次被执行,就是说可能重复执行了几次。那这种情况下呢,就别让它占代码行数了,就直接拿出去吧。要用的时候再调用就好了。这就是程序内部的模块化。
这叫啥?你可以叫它subroutine 或者 function。
subroutine 重用
FORM
举个小例子。你执行一个很小的功能:
定义成string就是动态长度。
但是我现在不这么弄了,我要弄成subroutine 怎么搞?
写成一个FORM,这个小模块的功能都在form里面。执行的时候用perform来调用就可以了。
当然输出语句也要调到前面去。因为你去执行perform的时候,FORM的代码就已经被调用了。
so easy…
呵呵,如果程序都这么简单,那确实是easy。然而现实世界不是1+1,而经常是849+234+762.
现实世界中,一个模块可能也有几百行代码。。而且不止这么两三个变量。而且这变量有可能不是全局变量。啥意思呢?我们用的p_fname,p_lname,name是这个大程序一开始就定义好了的,这叫全局变量。就相当于你公司的大老板,他布置的任务,他下面的部门经理得听,部门经理下面的小组长得听,那小员工也必须得听。层层往下,全部通吃。
但是你们的小组长,发布的命令,那只能通行于你们组。。出了这个组,那可能就不好使了。他的任务就是本地变量,就只能用在你们组内。
如果让他用本地变量,在整个公司下,那是没结果的。如果你debug去,程序跑到name无值,你再回过头去看f_name他会告诉你无效变量。因为出了这个小组这个变量行不通。
USING、CHANGING
你说,那小组长的指令不能白发啊。有时候,小组长有先见之明,揣测好大老板的意图并提前实现了全部功能。就是指令名字不一样。。这里咋办呢?找个媒介来翻译一下。把大老板的指令和小组长的指令衔接一下。再整理一下传回去。
那这个媒介,就是这两货:USING和CHANGING。体会这两个词的意思。用大老板的指令,并修改传回小组长的结果。
include 重构
include也是模块化的一种,但是和subroutine很不一样。subroutine是说我有一个功能,像是一个公式。我计算三角形面积,我计算⚪的面积。我想要计算的时候哦,我调用它一下就行了。我不用重复写在程序里。
那么include是,我想在程序里看到。但是就像我把家分成了客厅卧室和厨房,我不想把所有功能都混在一起,我不要在马桶旁做饭,那么我用include来隔墙,把各个不同功能分区。为了方便读取程序代码。空间还是这么大,但是有了逻辑意义上的分区,我就能快速找到我想看的功能。
怎么弄呢?你的一个大几百行,一千多行的代码,读起来很痛苦 。那么可以建几个include程序。把变量声明放进一个include里面。把数据选择放进一个include里面,把数据读取放进另一个include里面。
写一个include,双击后面的名字。
把变量声明部分放进去。然后依照功能把程序分拆成多个include。
当然还可以和subroutine结合。一个include中可以包含FORM的定义,另一个routine包含perform执行语句。
Function module 重用
可以跨程序,跨系统,跨client。
跟subroutine的功能一样,是可以重用,但是它可以跨程序。回忆一下我们之前的subroutine。
现在我们来调用一个FM。
Call
和subroutine的perform不同,这里用到call。
如果你知道这个FM的名字。可以用个pattern来帮忙:
这个里面是importing和exporting。其实和form的格式差不多。
USING就是EXPORTING, CHANGING就是IMPORTING。
你传进去给它的值是exporting (是从我的主程序出给他的),它给你的值是importing(就是从它的处理过的进来的)。
要确定你的变量和它的定义变量类型一致。
如何创建一个功能模块
什么是tables,什么是exceptions。
***待续 2021.11.29 我明明记得我写过了啊,难道是没保存😭😭😭
现在回头来总结,总的来说呢,关于模块化编程。
其实分为两类,一类是没有参数的。一类是有参数的。
没有参数的就是include程序。
有参数的就是可调用的。又分为内部调用和外部调用。
内部调用的子程序:Form。
外部调用的程序:function module。
Form就相当于C语言的形参实参,需要传参数值。那么用到using,changing。就是传值过去,和修改后的值传回。
function module也有点像,exporting,importing。当然还有更多的tables,exceptions就是不仅能传单个变量值,还能传整张表的值。还可以给出例外的错误提示。