`

抛掉重用的幻想,好使就行:用脚本生成脚本的例子

 
阅读更多
抛掉重用的幻想,好使就行:用脚本生成脚本的例子

阿于同学说过,合肥同学不懂什么是"好使",所以,先解释一下。"好使"可能是东北方言,大意是 可用,能工作,趁手。

今天讲的是在用脚本生成脚本中,可以对付到什么程度。

当年写用vba自动判卷的时候,某张同学说"这个要是再这么一下,那就更好了",小韩老师说"唉呀大姐 (我记得是这样说的,小张比小韩要小) ,你是要开发个工具,不是产品。"

韩老师说的话大抵容易懂,而深刻,对我颇有教益,这一句就是。代码可以重用到什么程度,给用户提供多大程度上的方便 (友好之类的),在工程中,不仅要看未来和追求,也要视为一个急功近利的短期行为。

如果我们在VBA判卷上做得那么完美的话,当年我跟偶像多半个下午判完全部试卷的传奇故事就不会发生了。我们可能今天还在追求某个完美的细节。我记得当年李老师质疑过我的判法,"你这么判,要是那么答,不就错了也得分么?"我答,"是啊,不过换成人判,比如你,就能那么认真了?"

写程序,我们要的只是比没程序更好,不是最好。"最"这种事,只存在于当今的媒体、人民的幻想及前后的之中。对不起,错了,语言不仅是"最",而且是"最最"。需要补课的同学请自行阅读参考书,这里不展开了。

有时候,追求完美的重用--对未来的无比重视--会让我们失去今天。当然,失去今天也就没有未来了。

比如,年轻男女经常讨论的问题,类似于"以后到底谁刷碗"啊这样的。重用这和这个类似。事实上,以我们的年轻和技术之浅薄,大多时候,因为没有足够的经验,我们根本无法预测未来会如何发展。重用是什么?重用是在*未来*被自己或别人*再次*使用。咱们这点破技术,知道未来如何再次使用这些代码么?

有同学说,"书里说了"。呵呵。

书归正传。用脚本生成脚本,一看这题目,不少同学就会想到编译原理啥的,还有同学想到了lisp里的宏。我说的不是这些高级题目,而是极其朴素的刚刚能对付得过去的手段。

1. 所谓朴素

所谓朴素,就是尽可能不使用和依赖高级的技术。比如,我到C++中的 flowcontrol的时候,讲到循环执行,给过这样的例子:

请输出从1到5的数字。

同学们给出的答案都是:

for(int i=0;i<5;++i)

{

printf ("%d\n", ++1);

}

当然,漂亮。

我的一个答案是这样的:

printf ("1\n");printf ("2\n");printf ("3\n");printf ("4\n");printf ("5\n");

我看到了,得有超过半个班级的同学对我的写法嗤之以鼻。这代码太烂了,马上就会有人指出,"要是输出到100呢,要是输出从8到20呢。"

我的代码的缺陷,缺乏重用性,数量大了不好改。一,谁说我准备重用了呢?我们一看到别人的问题,往往就要预想提问者的动机,有时甚至解读过度。中层对上层的解读,往往如此,下层就受了苦。二,数量大的时候,其实也简单,我可以在excel按ctrl拉鼠标,得到数字序列,然后再把这一列粘到C代码里。

之所以能这么对付,是因为,我也可以假设这段代码只用一次,而且只被我一人使用。

2. 例1,跟牛同学的讨论

前几天跟刘同学一起破解了个软件,我的解法暴力而有效,刘的解法更好,极其优雅。可惜现在似乎还不宜显摆具体内容。不过,后续与牛同学的一些交流可以在此讨论一下。

我为牛同学分配的任务是,把这好几千个文件的名字改成符合某个算法要求的文件名。文件名的对应关系,一部分在数据库里,一部分是C#代码。

你打算怎么实现?牛同学准备写C#程序读数据库。

我建议的方案是这样的,一个标准的对付流程。

(1) 写C#程序,就是那段算法;(2) 把数据库里的作为算法输入的那一列复制到C#代码里;(3) 让段C#程序,输出很多行这样的文字:mv "源文件名" "目标文件名"

以上,用C#生成了shell程序或批处理,然后跑一遍就改了所有文件名。C#本身并不操作数据库 (人手拷过来的),也不操作文件系统 (由shell程序完成)。

如果算法变了呢?如果源文件列表变了呢?如果……所有这些问题的答案都是:重新跑一遍上面的流程。用人,而不是用程序的可重用性。

当鳄鱼冲上来咬你的时候,有一种情况,你绝对不要用刀。那就是,你手头没有刀的时候。另一种情况,不建议用刀。那就是,你用刀非常不熟练的时候。你可以抱住鳄鱼的嘴,它的咬合力惊人,但是张嘴的肌肉非常软弱。这个时候,并不是你训练自己用刀的时候。

同样的,当你不熟悉数据库操作,不熟悉在C#里文件系统操作的时候,你应该做的是 不用它们。项目是用来解决问题的,其原始动机不是给咱们训练技术的--技术可以在自己练习的时候做。项目唯一能训练的,是工程能力。就像鳄鱼问题能训练的是随机应变和灵活寻找解决问题的手段。

3. 例2

我有个top250电影目录,下载的时候不知怎么整的,文件名非常长,而且中文部分是乱码。一直准备把中文部分都删了,长期拖延,昨天晚上整了。

原始的文件名类似于:Top093.罪恶城市.Sin.City.UNRATED.ReCut.EXT.2005.BDRip.MiniSD-TLF.mkv

准备改为Top093.Sin.City.UNRATED.ReCut.EXT.2005.BDRip.MiniSD-TLF.mkv

这样的文件有250个。

这么整的。下面是一个整行

$ ls -1 Top* | awk -F. '{ first=$1;min=length($1)+length($2)+3;max=length($0);print ("mv \"" $0 "\" "first "." substr($0,min,max))}'> ren.sh; chmod +x ren.sh

然后,执行这个脚本,文件名就都改完了。文件中有 ' 或 ( 的,可能会出错。

ren.sh这个脚本,是重定向输出的前半段产生的。这是unix系统管理中常用的一个手段,用程序A生成一个脚本,用生成的脚本,而不是直接用程序A解决问题。

脚本的内容是很多个这样的行,下面也是一个整行:mv Top093.罪恶城市.Sin.City.UNRATED.ReCut.EXT.2005.BDRip.MiniSD-TLF.mkv Top093.Sin.City.UNRATED.ReCut.EXT.2005.BDRip.MiniSD-TLF.mkv

4. 例4

做等级考试的系统时,要批量ping机器以确定每台机器网络正常。我也使用了类似的方法,用C生成ping.bat。bat里面是很多ping目标地址,及只ping一次的参数,似乎还有一个超时设置为半秒的限制;C负责循环IP地址,好象是这样printf ("ping -n 1 192.168.0.%d", i++);。

IP地址的循环,我也用excel实现过。那套方案里,连C也不用。excel的几例中,有一例是文字"ping -n 1 ",其余几例是IP地址的4个部分,其中最后一部分用ctrl实现数字的递增。

更早,也更朴素的方法,我用记事本复制第一行ping,然后粘贴几次,每次复制已粘过的,行数翻倍增长;然后再手动修改IP地址最后一段。

这些方法都很朴素,但是有效。

5. 总结

核心思想是,用代码生成代码;在这个过程是,保持注意目标是"小工具",抛开重用的幻想。

关同学前两天提到,我们在既往的开发中,代码最终都没有重用。我想,代码不必重用,或者说,我们远没有达到那个高级阶段。能够解决问题,并重用解决问题的手段--设计,就非常不错了。而且,毕竟设计很值钱,而代码够便宜。

--------------------博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

[http://www.renren.com/268966623/profile#pblog]

分享到:
评论

相关推荐

    ROS 脚本生成器 4.62

    ROS(Robot Operating System)脚本生成器是一款专为ROS开发者设计的强大工具,旨在简化ROS系统的配置过程,提高开发效率。版本4.62是该工具的一个更新,它可能包含了优化的功能和修复的bug,以更好地服务于2013年2...

    ros脚本生成器支持2.9-6.x版本

    在使用ROS脚本生成器时,开发者可以预定义脚本模板,根据项目需求快速生成相应的ROS节点脚本。这包括创建节点类、定义消息和服务类型、设置参数和回调函数等。此外,该工具可能还提供了代码自动生成、自动格式化、...

    ROS脚本生成器mikrotik,支持5.X 6.X版本

    5. **错误检查**:在生成脚本前,可能有内置的语法检查功能,确保生成的脚本符合ROS的语法规则,减少因配置错误导致的问题。 6. **更新与维护**:版本号Ver2.11表明这是一个经过多次迭代和优化的版本,意味着它可能...

    可以直接生成tb的perl脚本

    标题中的“可以直接生成tb的perl脚本”意味着我们可以使用Perl编程语言编写一个脚本来自动生成FPGA仿真所需的测试平台代码。这种自动化可以极大地提高开发效率,减少手动编写测试平台代码的工作量和错误率。 Perl...

    Shell脚本编程以及几个Shell脚本例子

    Shell脚本编程是一种在Linux和类Unix操作系统中广泛使用的自动化工具,它允许用户通过命令行接口执行一系列操作。本文将深入探讨Shell脚本的基础知识,包括语法、常用命令及几个实用脚本示例,旨在帮助Linux新手快速...

    matlab零基础入门彩色图像技术:15 脚本m文件.zip

    - **注释**:使用%符号开始的行被视为注释,用于解释代码功能。 - **数据类型**:MATLAB支持多种数据类型,如标量、向量、矩阵、数组和结构体等。 2. **彩色图像表示**: - **RGB模型**:最常用的彩色图像表示...

    120个AE极品脚本打包

    通过使用这些脚本,用户可以快速生成专业级别的特效,而无需从零开始一步步设置。 "120个AE极品脚本打包"可能包含以下类型的脚本: 1. **预设管理**:这类脚本可以帮助用户整理、分类和快速访问自己的预设,包括转...

    从Matlab_Simulink生成易读可重用代码

    这种代码生成技术,可以减少手动编写代码的时间,提高软件开发效率,同时保证了生成的代码的可靠性和可重用性。 ### MATLAB Coder和Simulink Coder 自MATLAB 2011b版本开始,MathWorks推出了MATLAB Coder作为单独...

    Intouch函数脚本与逻辑使用指南

    ### Intouch函数脚本与逻辑使用指南 #### 一、Intouch脚本基础概述 Intouch 是一款由 Invensys Systems 开发的人机界面 (HMI) 软件,广泛应用于工业自动化领域。该软件提供了强大的脚本功能,允许用户自定义逻辑...

    高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍

    《高级Bash脚本编程指南》是一本专为Linux用户设计的深度探索Shell脚本艺术的书籍。在Linux操作系统中,Bash(Bourne-Again SHell)是默认的命令解释器,也是编写自动化任务和系统管理脚本的首选工具。这本书以其...

    游戏脚本-虚空行者-卡萨丁1.zip

    游戏脚本通常使用的是高级脚本语言,如Lua、Python、JavaScript或Unity的C#脚本等。这些语言易于学习,且能够快速实现功能,适合游戏逻辑的编写。例如,"虚空行者-卡萨丁1"可能代表一个游戏角色或者游戏关卡的特定...

    Microsoft Windows脚本技术

    是Windows操作系统中一种强大的自动化和配置工具,它结合了脚本语言(如VBScript和JScript)与Windows管理接口(WMI)以及ActiveX组件,使得系统管理员和开发者能够编写高效能的、可重复使用的自动化脚本来执行各种...

    轻松入门MATLAB:17 matlab脚本文件和函数文件的区别.zip

    MATLAB是一种广泛应用于科学计算、数据分析、算法开发和系统建模的高级编程环境。它以其简洁的语法和强大的数学功能而...在实际编程中,结合使用脚本和函数,不仅可以使代码结构清晰,还能增强代码的重用性和可维护性。

    计算机自动化测试脚本写作模板

    使用数据驱动测试,使脚本适应多种输入情况。 5. **测试脚本结构**:典型的测试脚本包括初始化(设置测试环境)、执行测试(调用被测试功能并传递参数)、断言(验证预期结果)和清理(恢复环境至初始状态)四个...

    可重用FragmentTabHost例子

    这样,只需传入不同的Fragment和标签信息,就能在任何需要的地方使用这个可重用的TabHost组件。 在"WCYClient"这个项目中,可能包含了实现以上步骤的代码示例,你可以通过查看源码进一步理解如何将这些理论知识应用...

    secureCRT - WR脚本

    【secureCRT - WR脚本】是一种使用VB.NET-2010编程语言编写的实用工具,主要用于提升secureCRT(版本7.2.4)的自动化操作效率。secureCRT是一款广泛使用的终端模拟器软件,它允许用户通过SSH协议连接到远程主机进行...

    QTP自动化框架脚本示例

    在学习和实践中,通过分析和运行提供的“QTP自动化框架脚本示例”,我们可以更好地理解和掌握上述知识点,提升自动化测试的能力。同时,也要不断探索和研究更高级的测试策略和技术,如测试框架设计、持续集成和敏捷...

    Windows脚本组件示例(HelloWorld.WSC).zip

    在Windows操作系统中,Windows脚本组件(Windows Script Component,WSC)是一种强大的工具,它允许开发者创建可重用的脚本对象,这些对象可以被VBScript或JScript等脚本语言调用。本示例"HelloWorld.WSC"是用于演示...

    matlab数理统计数据分析:17 matlab脚本文件和函数文件的区别(含教学视频).zip

    当你运行一个脚本时,MATLAB会依次执行文件中的每一行代码,不接受输入参数,也不会返回任何值(除非在脚本的最后使用`disp`或`return`命令)。脚本文件通常用于实现一系列相关的计算任务,比如数据预处理、简单的...

Global site tag (gtag.js) - Google Analytics