成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據即代碼,我和小伙伴們都驚呆了!

開發 前端 開發工具
幾個小伙伴在考慮下面這個各個語言都會遇到的問題:問題:設計一個命令行參數解析API

幾個小伙伴在考慮下面這個各個語言都會遇到的問題:

問題:設計一個命令行參數解析API

一個好的命令行參數解析庫一般涉及到這幾個常見的方面:

1) 支持方便地生成幫助信息

2) 支持子命令,比如:git包含了push, pull, commit等多種子命令

3) 支持單字符選項、多字符選項、標志選項、參數選項等多種選項和位置參數

4) 支持選項默認值,比如:–port選項若未指定認為5037

5) 支持使用模式,比如:tar命令的-c和-x是互斥選項,屬于不同的使用模式

經過一番考察,小伙伴們發現了這個幾個有代表性的API設計:

1. getopt():

getopt()是libc的標準函數,很多語言中都能找到它的移植版本。

  1. //C 
  2. while ((c = getopt(argc, argv, "ac:d:")) != -1) { 
  3.     int this_option_optind = optind ? optind : 1; 
  4.     switch (c) { 
  5.     case 'a'
  6.         printf ("option a"); 
  7.         aopt = 1; 
  8.         break
  9.     case 'c'
  10.         printf ("option c with value '%s'", optarg); 
  11.         copt = optarg; 
  12.         break
  13.     case 'd'
  14.         printf ("option d with value '%s'", optarg); 
  15.         dopt = optarg; 
  16.         break
  17.     case '?'
  18.         break
  19.     default
  20.         printf ("?? getopt returned character code 0%o ??", c); 
  21.     } 

getopt()的核心是一個類似printf的格式字符串的命令行參數描述串,如上面的”ac:d:”定義了”a”, “c”,”d”3個命令行參數,其中,a是一個標志符不需要參數,”c”和”d”需要跟參數。getopt()功能非常弱,只支持單個字符的標志選項和參 數選項。如果按上面的5點來比對,基本上只能說是勉強支持第3點,其他幾項只能靠程序自己來實現了,所以,想直接基于getopt()實現一個像git這 樣復雜的命令行參數是不可能的,只有自己來做很多的解析工作。小伙伴們看過getopt()之后一致的評價是:圖樣圖森破。

2. Google gflags

接著,小伙伴們又發現了gflags這個Google出品C++命令行參數解析庫。

  1. /C++ 
  2. DEFINE_bool(memory_pool, false"If use memory pool"); 
  3. DEFINE_bool(daemon, true"If started as daemon"); 
  4. DEFINE_string(module_id, """Server module id"); 
  5. DEFINE_int32(http_port, 80, "HTTP listen port"); 
  6. DEFINE_int32(https_port, 443, "HTTPS listen port"); 
  7.   
  8. int main(int argc, char** argv) { 
  9.     ::google::ParseCommandLineFlags(&argc, &argv, true); 
  10.   
  11.     printf("Server module id: %s", FLAGS_module_id.c_str()); 
  12.   
  13.     if (FLAGS_daemon) { 
  14.       printf("Run as daemon: %d", FLAGS_daemon); 
  15.     } 
  16.     if (FLAGS_memory_pool) { 
  17.       printf("Use memory pool: %d", FLAGS_daemon); 
  18.     } 
  19.   
  20.     Server server; 
  21.   
  22.     return 0; 

小伙伴們看了后不由得感嘆“真心好用啊”!的確,gflags簡單地通過幾個宏就定義了命令行選項,基本上很好的支持了上面提到的1,3,4這幾 項,比起getopt()來強多了。對于類似cp這樣的小命令,gflags應該是夠用了,但要達到git這種級別就顯得有些單薄了。

3. Ruby Commander

接下來小伙伴們又發現了Ruby Commander庫:

  1. //Ruby 
  2. # :name is optional, otherwise uses the basename of this executable 
  3. program :name'Foo Bar' 
  4. program :version'1.0.0' 
  5. program :description'Stupid command that prints foo or bar.' 
  6. command :bar do |c| 
  7.   c.syntax = 'foobar bar [options]' 
  8.   c.description = 'Display bar with optional prefix and suffix' 
  9.   c.option '--prefix STRING'String'Adds a prefix to bar' 
  10.   c.option '--suffix STRING'String'Adds a suffix to bar' 
  11.   c.action do |args, options| 
  12.     options.default :prefix => '(':suffix => ')' 
  13.     say "#{options.prefix}bar#{options.suffix}" 
  14.   end 
  15. end 
  16. $ foobar bar 
  17. # => (bar) 
  18. $ foobar bar --suffix '}' --prefix '{' 
  19. # => {bar} 

Commander庫利用Ruby酷炫的語法定義了一種描述命令行參數的內部DSL,看起來相當高端大氣上檔次。除了上面的第5項之外,其他幾項都 有很好的支持,可以說Commander庫的設計基本達到了git這種級別命令行參數解析的要求。只是,要搞懂Ruby這么炫的語法和這個庫的使用方法恐 怕就不如getopt()和gflags容易了。有小伙伴當場表示想要學習Ruby,但是也有小伙伴表示再看看其他庫再說。

4. Lisp cmdline庫

接下來,小伙伴們發現了Lisp方言Racket的cmdline庫。

  1. //Lisp 
  2. (parse-command-line "compile" (current-command-line-arguments) 
  3.   `((once-each 
  4.      [("-v" "--verbose"
  5.       ,(lambda (flag) (verbose-mode #t)) 
  6.       ("Compile with verbose messages")] 
  7.      [("-p" "--profile"
  8.       ,(lambda (flag) (profiling-on #t)) 
  9.       ("Compile with profiling")]) 
  10.     (once-any 
  11.      [("-o" "--optimize-1"
  12.       ,(lambda (flag) (optimize-level 1)) 
  13.       ("Compile with optimization level 1")] 
  14.      [("--optimize-2"
  15.       ,(lambda (flag) (optimize-level 2)) 
  16.       (("Compile with optimization level 2," 
  17.         "which implies all optimizations of level 1"))]) 
  18.     (multi 
  19.      [("-l" "--link-flags"
  20.       ,(lambda (flag lf) (link-flags (cons lf (link-flags)))) 
  21.       ("Add a flag <lf> for the linker" "lf")])) 
  22.    (lambda (flag-accum file) file) 
  23.    '("filename")) 

這是神馬浮云啊?括號套括號,看起來很厲害的樣子,但又不是很明白。看到這樣的設計,有的小伙伴連評價都懶得評價了,但也有的小伙伴對Lisp越發崇拜,表示Lisp就是所謂的終極語言了,沒有哪門語言能寫出這么不明覺歷的代碼來!小伙伴們正準備打完收工,突然…

5. Node.js的LineParser庫

發現了Node.js的LineParser庫:

  1. //JavaScript 
  2. var meta = { 
  3.     program : 'adb'
  4.     name : 'Android Debug Bridge'
  5.     version : '1.0.3'
  6.     subcommands : [ 'connect''disconnect''install' ], 
  7.     options : { 
  8.     flags : [ 
  9.         [ 'h''help''print program usage' ], 
  10.         [ 'r''reinstall''reinstall package' ], 
  11.         [ 'l''localhost''localhost' ] 
  12.     ], 
  13.     parameters : [ 
  14.         [ null'host''adb server hostname or IP address'null ], 
  15.         [ 'p''port''adb server port', 5037 ] 
  16.     ] 
  17.     }, 
  18.     usages : [ 
  19.     [ 'connect', ['host''[port]'], null'connect to adb server', adb_connect ], 
  20.     [ 'connect', [ 'l' ], null'connect to the local adb server', adb_connect ], 
  21.     [ 'disconnect'nullnull'disconnect from adb server', adb_disconnect ], 
  22.     [ 'install', ['r'], ['package'], 'install package', adb_install ], 
  23.     [ null, ['h'], null'help', adb_help ], 
  24.     ] 
  25. }; 
  26.   
  27. try { 
  28.     var lineparser = require('lineparser'); 
  29.     var parser = lineparser.init(meta); 
  30.     parser.parse(['install''-r''/pkgs/bird.apk']); // adb_install will be invoked 
  31. catch (e) { 
  32.     console.error(e); 

天啊!?這是什么?我和小伙伴們徹底驚呆了!短短十幾行代碼就獲得了上面5點的全面支持,重要的是小伙伴們居然一下子就看懂了,沒有任何的遮遮掩掩 和故弄玄虛。本來以為Ruby和Lisp很酷,小伙伴們都想馬上去學Ruby和Lisp了,看到這個代碼之后怎么感覺前面全是在裝呢?有個小伙伴居然激動 得哭著表示:我寫代碼多年,以為再也沒有什么代碼可以讓我感動,沒想到這段代碼如此精妙,我不由得要贊嘆了,實在是太漂亮了!

小伙伴們的故事講完了,您看懂了嗎?如果沒有再看一遍標題吧!

原文鏈接:http://coolshell.cn/articles/10337.html

責任編輯:陳四芳 來源: 酷殼網
相關推薦

2013-07-22 11:06:37

2015-05-19 14:30:48

加密視頻加密億賽通

2013-12-27 09:46:40

Windows 9Windows 9桌面

2015-12-15 10:33:59

域名網絡域名

2016-12-21 12:19:57

AR廣告奧迪

2013-12-19 10:20:19

2013-07-30 09:49:28

聯通定向流量微信定向流量移動

2023-03-27 00:06:12

2013-08-05 14:34:46

2014-01-22 14:27:25

科技創業者人品

2021-05-28 10:09:22

GC詳解Java JVM

2013-08-09 14:33:34

2014-07-10 14:48:26

無線路由器

2022-06-01 08:50:23

分布式事務模式

2014-11-26 10:47:46

虛擬現實蘋果

2013-09-27 13:34:09

BAT百度騰訊

2020-09-21 06:45:48

監控延遲消息隊列

2020-10-31 09:06:37

C語言編程語言

2021-11-02 11:31:47

Go代碼模式

2021-03-08 08:16:30

負載均衡系統流量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色一级免费 | 日韩在线视频观看 | 日韩在线一区二区 | 国产精品一二三区 | 日韩精品在线一区二区 | 欧美一级免费看 | 在线观看h视频 | 国产91久久久久蜜臀青青天草二 | av一区在线 | 亚洲成人一区 | 99久久精品免费看国产四区 | 国产精品日韩欧美一区二区三区 | 午夜男人的天堂 | 亚洲高清一区二区三区 | 免费亚洲婷婷 | 一区二区三区在线免费观看视频 | www午夜视频| 亚洲高清免费视频 | 欧美性视频在线播放 | 91麻豆精品国产91久久久更新资源速度超快 | 成人毛片视频在线播放 | 九一在线观看 | 日本精品一区二区三区在线观看视频 | 日韩欧美高清dvd碟片 | 欧美视频第三页 | 国内精品视频在线观看 | 国户精品久久久久久久久久久不卡 | 国产精品久久久久一区二区三区 | 日韩色视频 | 夜夜夜久久久 | 亚洲精品一区二区久 | 四虎影院在线观看av | 777zyz色资源站在线观看 | 国产黑丝在线 | 伊人青青久久 | 亚洲一区二区免费电影 | 永久www成人看片 | 日本一道本视频 | 久草网址| 日本不卡在线观看 | 亚洲一区久久 |