这些天总是想要用ruby做点什么,因为喜欢ruby,也因为最近技术上缺少变化,想要主动的搞点不同的东西。想了不少的东西,但是很显然现在很忙,白天也不会有时间,只有晚上做,因此不能太大了,完整的系统就不要想了,但是找些耦合性不大的,有点意思的模块还是没有问题的,不如就做一个编号生成模块吧。
今天周六,在床上睡得七荤八素的,想到左右没有事情,或者想到些事情也不想动,不如写写这个模块,动手。
先看看需求
A. Feat:做一个编号生成模块
1. 通过类似${yyyy}-${mm}-${dd}-string-${autonum}样式来生成编码,这样生成的编号在今天就是2008-06-14-string-1,依次递增。
2. 可以配置上面的格式化字符串
3. 可以生成一个新的编号,并且不会重复,前面字符串变化后,后面的autonum可以归零再来。
B. 技术限定:用函数,不要动不动就是数据库,想都不能想;总在做数据库,早就烦了,这次至少要改变些什么,要不然太没有意思了。
C. 我要做的就是这个函数
function GenenateSerialNo(serial_format,last_serial_no,last_num)
当然需要通过下面的测试。实际上有了测试,这个函数才完整。
D. testcase :
assert_equal("2008-6-14-string-1",GenenateSerialNo("${yyyy}-${mm}-${dd}-string-${autonum}","",0))
assert_equal("2008-6-14-string-4",GenenateSerialNo("${yyyy}-${mm}-${dd}-string-${autonum}","2008-6-14-string-3",3))
assert_equal("2008-6-14-string-9",GenenateSerialNo("${yyyy}-${mm}-${dd}-string-${autonum}","2008-6-14-string-8",8))
assert_equal("2008-6-14-string-1",GenenateSerialNo("${yyyy}-${mm}-${dd}-string-${autonum}","2008-6-13-string-8",8))
如果用数据库的思路,现要考虑数据库表如何规划,上一个num和上一个格式化字符串的位置,还有这3张表的关系,耦合大了去了,又如何去重用呢?
E. Testcase换成Ruby的表达,更详细的设计
可是我不知道在ruby中如何表达单元测试?
google "ruby unit test"
找到一个例子:
少许调整,改成自己想要的东西。然后....ruby serail_test
架子成了,休息下,听音乐,音乐好啊。
F. 开始写代码 - 表意代码,但是必须替换为ruby的样子,ruby估计不会有什么now.month,也不会有replace的方法。
def GenenateSerialNo(serial_format,last_serial_no,last_num)
serial_format.replace("${yyyy}",now.year);
serial_format.replace("${mm}",now.month);
serial_format.replace("${dd}",now.day);
temp = serail.replace("${autonum},last_num")
if (temp == last_serial_no)
serial_format.replace("${autonum}",last_num+1);
else
serial_format.replace("${autonum}",1);
serial_format
end
这些代码只能算是伪代码,表达意思没有问题,但是ruby显然不是这样表达的,其中的日期函数肯定不是这样的,replace函数恐怕也没有,就算有,恐怕也不能用一个数字来替换,比如last_num,必须转成string才可以。
G. 如何表达string.replace ? 继续google "ruby string replace ",知道gsub可以干这个事情
用irb验证
"abc".gsub("ab","c)
==> cc
就是它。
H. 那么now.year 呢? google :"ruby date year",每个语言对日期的处理都不一样,不过也没有必要说那么多,都是知识性的,总之找到,然后用irb来测试。
irb(main):011:0> Time.now.day
=> 14
irb(main):012:0> Time.now.year
=> 2008
irb(main):013:0> Time.now.month
=> 6
irb(main):015:0> Time.now.month.to_s()
=> "6"
irb(main):016:0> Time.now.month.to_s
=> "6"
这样基本库函数的就比较明确了,正式编码了。
J. 废话少说,看代码,然后通过第一个测试,随后以及也就通过了,懒得在看了。
def GenenateSerialNo(serial_format,last_serial_no,last_num)
serial = serial_format
serial = serial.gsub("${yyyy}",Time.now.year.to_s)
serial = serial.gsub("${mm}",Time.now.month.to_s)
serial = serial.gsub("${dd}",Time.now.day.to_s)
temp = serial.gsub("${autonum}",last_num.to_s)
if (temp == last_serial_no)
serial = serial.gsub("${autonum}",(last_num+1).to_s);
else
serial = serial.gsub("${autonum}",1.to_s);
serial
end
end
K. 总结
一开始通过测试驱动的方式来,更加容易集中于代码,而不是考虑数据库如何,表如何.
因为和数据库,表没有关系,更加容易重用。
因为和数据库没有关系,也就有了新意,好玩,并且代码也就不多。
不要着急进入代码细节,先表意,然后用ruby翻译,当然如果ruby比较熟悉了,可以一步到位,而我现在不熟悉,就干脆从顶到下,思路更加清晰。人的头脑不适合在层次中切换,如果先考虑好上一层,然后在进入下一层,当然更加容易。
irb可以交互执行,看库函数,或者快速看结果更合适,不像ruby.exe 那么死板。可以在刚刚提到的场合多用,这个工具更加容易看到脚本比编译的灵活快速的特点。
分享到:
相关推荐
src-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2...
《深入理解Ruby调试工具:ruby-debug-ide》 在Ruby编程世界中,高效的问题排查与代码调试是开发者必备的技能之一。ruby-debug-ide正是这样一个强大的调试接口,它为Ruby开发环境提供了集成的调试支持,使得开发者...
"rubyinstaller-devkit-2.5.3-1-x64.exe"是Ruby安装程序的名称,它包含了Ruby解释器以及DevKit。RubyInstaller是Windows平台上用于安装Ruby的工具,它可以轻松地在Windows系统上搭建Ruby环境。DevKit则是一个配套...
《SQLite3 Ruby绑定在Windows平台的应用与解析》 SQLite3是一种轻量级的、自包含的、无服务器的SQL数据库引擎,广泛应用于嵌入式系统和小型应用中。Ruby是面向对象的脚本语言,以其简洁优雅的语法和强大的功能深受...
总的来说,"rubyinstaller-devkit-3.0.2-1-x64.zip"是一个完整的Ruby开发环境,包含Ruby解释器和必要的开发工具,使得Windows用户可以轻松地安装和使用Ruby及其相关的开源库。这个压缩包对于希望在Windows系统上进行...
mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe
Ruby,一种为简单快捷的面向对象编程(面向对象程序设计)而创的脚本语言,在20世纪90年代由日本人松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于 Perl、...
ruby安装包-rubyinstaller-devkit-3.0.2-1-x64安装文件 Ruby是一种面向对象、动态类型的脚本语言,由Yukihiro "Matz" Matsumoto于1995年创建。它以其简洁、优雅的语法和强大的编程能力而闻名,广泛应用于Web开发、...
ruby-irb-1.8.7.352-13.el6.x86_64.rpm ruby-irb-1.8.7.352-13.el6.x86_64.rpm
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
ruby186-25 for windows
1. `ruby-debug-base-0.10.4.gem`:这是`ruby-debug`的核心库,提供了基本的调试功能,如断点管理、堆栈跟踪、变量查看等。它包含了实现调试器所需的大部分逻辑,并为其他模块提供了接口。 2. `linecache19-0.5.12....
6. `ruby-oci8-1.0.7-x86-mswin32-60.gem`:专为Windows上的Ruby 1.9.x编译的版本。 7. `ruby-oci8-2.1.0.tar.gz` 和 `ruby-oci8-2.0.6.tar.gz`:源代码包,可以自行编译安装。 8. `ruby-oci8-1.0.7.tar.gz`:同上,...
Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘于1995年设计并开发。Ruby的设计理念是简洁、优雅,并注重程序员的生产力,它提供了丰富的内置库和强大的元编程能力。在本压缩包"ruby-1.9.3-p547.tar....
ruby-debug-base19-0.11.26.gem
这个版本是Ruby的1.9.2分支的一个更新点,标记为p290,意味着它是该分支的第290个补丁级别。在Ruby的版本管理中,每个“p”后面的数字代表对主版本或次要版本的修复和改进的集合。 Ruby是一种动态类型、面向对象的...
Ruby是一种面向对象、动态类型的脚本语言,由Yukihiro "Matz" Matsumoto于1995年创建。它以其简洁、优雅的语法和强大的元编程能力而闻名,被广泛应用于Web开发、系统管理、自动化任务以及各种工具的编写。在Linux...
跟其它界面开发包不同的是,Ruby-GNOME2不仅仅提 供界面控件,它提供了整个GNOME 2.0的环境,包含Ruby/GLib2、Ruby/ATK、Ruby/Pango、Ruby/GTK2、Ruby/GnomeCanvas2、Ruby /GNOME2、Ruby/GnomeVFS、Ruby/GtkHtml2、...
savon-ruby-gem
ruby-oci8-2.1.5-x86-mingw32.gem,ruby连接oracle数据库gem包