B6 Rubyセッション Rubyコーディング 作 法 - きっと 役 に 立 つコーディング 規 約 株 式 会 社 ネットワーク 応 用 通 信 研 究 所 小 倉 正 充 アジェンダ ネットワーク 応 用 通 信 研 究 所 について コーディングルールについて コーディングルールの 解 説 2 1
ネットワーク 応 用 通 信 研 究 所 について ネットワーク 応 用 通 信 研 究 所 について ネットワーク 応 用 通 信 研 究 所 (NaCl) NaClについて どんなことをしている 会 社? Ruby 開 発 とのかかわり 3rdRailの 利 用 4 2
会 社 紹 介 NaClについて 株 式 会 社 ネットワーク 応 用 通 信 研 究 所 Network Applied Communication Laboratory Ltd. 略 称 はNaCl(えぬえーしーえる) 本 社 島 根 県 松 江 市 支 社 東 京 都 千 代 田 区 外 神 田 Ruby 作 者 のまつもとゆきひろが 在 籍 5 会 社 紹 介 どんなことをしている 会 社? オープンソースソフトウェアを 活 用 したソリューションの 提 供 最 近 の 事 例 日 本 医 師 会 日 医 標 準 レセプトソフトの 開 発 稼 動 状 況 6,370 施 設 (8/15 現 在 ) Ruby on Railsを 利 用 したWebサイトの 開 発 と 支 援 島 根 県 CMS ニフティ 株 式 会 社 @nifty Timelineβなど 松 江 医 療 費 高 額 合 算 システム 6 3
会 社 紹 介 Ruby 開 発 とのかかわり まつもとゆきひろはRuby 開 発 専 任 ruby-lang.orgやrubyist.netによるサービス 提 供 リソースの 提 供 ( 場 所 回 線 など) Rubyの 開 発 方 針 はコミュニティ 主 導 NaClは 口 を 出 さない 7 Ruby / Rails による Webアプリケーションの 実 例 (1/2) 島 根 県 CMS オープンソースライセンスで 公 開 8 4
Ruby / Rails による Webアプリケーションの 実 例 (2/2) ニフティ 株 式 会 社 @nifty TimeLine β 9 Ruby / Railsによる 自 治 体 基 幹 業 務 開 発 松 江 市 医 療 費 高 額 合 算 システム IPAの 公 募 事 業 として 実 施 松 江 市 ( 株 )テクノプロジェクト 伊 藤 忠 テクノソリューションズ( 株 ) ( 株 )ネットワーク 応 用 通 信 研 究 所 平 成 20 年 度 から 運 用 開 始 新 規 開 発 は 全 てRubyで 開 発 成 果 物 は 全 て 公 開 中 http://www.tpj.co.jp/service/system/ipa2007/ http://www.ipa.go.jp/software/open/ossc/2007/stc/report/matsue.html 10 5
3rdRailの 利 用 3rdRail Ruby / Ruby on Rails 統 合 開 発 環 境 日 本 語 版 テスタ 開 発 者 が 利 用 しやすい 製 品 の 開 発 に 協 力 教 育 事 業 RubyやRuby on Railsの 教 育 に 最 適 11 Ruby / Railsの 教 育 プログラム Rubyの 教 育 プログラム 2006 年 から 開 発 提 供 教 育 プログラム 開 催 実 績 2008 年 5 月 時 点 コース Ruby 入 門 Ruby on Rails 入 門 実 践 Ruby on Rails アジャイル 開 発 Ruby on Rails 運 用 提 供 開 始 時 期 2007 年 7 月 ~ 2007 年 7 月 ~ 2006 年 5 月 ~ 2007 年 12 月 ~ 開 催 数 16 回 11 回 16 回 1 回 2007 年 7 月 以 降 ( 株 )CTCテクノロジーにて 定 期 開 催 http://www.school.ctc-g.co.jp/ 現 在 3rdRailにて 展 開 中 12 6
コーディングルールについて コーディングルールについて コーディングルールってなに? コーディングルールの 目 的 Rubyとコーディングルール 14 7
コーディングルールってなに? コーディングルール ソースコードの 書 き 方 の 規 則 の 集 合 規 約 の 種 類 命 名 規 約 整 形 に 関 する 規 約 構 文 に 関 する 規 約 etc. 15 コーディングルールの 目 的 共 有 保 守 をしやすくする ソースコードを 読 みやすくする 品 質 を 上 げる 開 発 者 間 で 手 法 を 統 一 できる レビューしやすくなる 方 向 性 を 与 える 変 数 名 のつけ 方 などの 指 針 を 得 られる 16 8
Rubyとコーディングルール 変 数 に 型 がない 同 じ 処 理 をする 違 う 書 き 方 が 多 い 文 字 列 の 例 : "hello", 'hello', % hello, %q hello 省 略 表 記 が 多 い メソッド 呼 び 出 しの 実 引 数 リスト 括 弧 return if/unless 式 のthen etc. 変 数 名 に 型 がないから 命 名 規 約 が 重 要 同 じ 処 理 でも 異 なるやり 方 があるのでどちらを 使 うか 統 一 する 17 コーディングルールの 解 説 9
今 回 説 明 する コーディングルールについて Rubyコーディング 規 約 で 紹 介 されているコーディングルールを 元 にしています http://shugo.net/ruby-codeconv/codeconv.html 19 コーディングルールの 解 説 命 名 規 約 整 形 に 関 する 規 約 構 文 に 関 する 規 約 20 10
命 名 規 約 定 数 名 メソッド 名 真 偽 値 を 返 すメソッド 名 破 壊 的 なメソッド 名 ファイル 名 21 定 数 名 (1/2) 定 数 変 数 名 の 制 約 先 頭 の 文 字 を 見 て 変 数 の 種 類 が 決 定 される 変 数 の 種 類 ローカル 変 数 インスタンス 変 数 クラス 変 数 グローバル 変 数 定 数 先 頭 文 字 小 文 字 または _ @ @@ $ 大 文 字 例 local_variable @instance_variable @@class_variable $global_variable CONSTANT 22 11
定 数 名 (2/2) 値 を 代 入 する 定 数 名 の 規 約 _ を 単 語 の 区 切 りとする すべて 大 文 字 とする クラス モジュール 名 としての 定 数 名 の 規 約 _ などの 区 切 り 文 字 を 使 用 しない 単 語 の 先 頭 以 外 は 小 文 字 にする 例 EXAMPLE_CONSTANT = 10 class ExampleClass 23 メソッド 名 メソッド 名 の 制 約 先 頭 が 小 文 字 または _ でなければならない メソッド 名 の 規 約 すべて 小 文 字 とする 単 語 の 区 切 りに _ を 用 いる メソッド 名 に 動 詞 を 使 う 場 合 は 動 詞 の 原 形 を 使 用 する 例 def add_something 24 12
真 偽 値 を 返 すメソッド 名 真 偽 値 を 返 すようなメソッドの 名 前 の 最 後 には? を 付 ける Rubyで 定 義 されている 真 偽 値 を 返 すメソッドの 例 "foo".empty? #=> false "".empty? #=> true empty? は 例 のように 空 文 字 列 のとき 真 を そうでないときは 偽 を 返 す 25 破 壊 的 なメソッド 名 破 壊 的 なメソッドの 名 前 の 最 後 には! を 付 ける 破 壊 的 なメソッドというのは レシーバー 自 身 を 変 更 してしまうメソッドのこ と Rubyに 定 義 されている 破 壊 的 メソッドの 例 array = [1, 3, 2] sorted_array = array.sort puts sorted_array #=> [1, 2, 3] puts array #=> [1, 3, 2] array.sort! puts array #=> [1, 2, 3] 26 13
ファイル 名 (1/3) クラス モジュール 名 からファイル 名 を 導 出 する 一 つのファイル 中 に 複 数 のクラスを 含 む 場 合 はモジュールを 名 前 空 間 として 使 用 し ディレクトリで 階 層 構 造 を 表 現 する ディレクトリ 名 はモジュール 名 から 導 出 します 名 前 の 導 出 ルール すべて 小 文 字 にする 単 語 を _ で 区 切 る 例 foo_bar.rb # FooBarクラスを 定 義 class FooBar 27 ファイル 名 (2/3) 例 foo.rb # Fooモジュールを 定 義 module Foo foo/bar_baz.rb # Foo::BarBazクラスを 定 義 module Foo class BarBaz foo/quu.rb # Foo::Quuクラスを 定 義 class Foo::Quu 28 14
ファイル 名 (3/3) 見 通 しがよければ 無 理 にファイルを 分 けなくてもよい class Foo class Bar class Baz 29 整 形 に 関 する 規 約 インデント 一 行 の 桁 数 コメント 30 15
インデント インデントはスペースのみを 使 用 し 幅 を2とする タブは 環 境 により 表 示 のされ 方 が 異 なる patch diff 印 刷 コピー アンド ペースト チームでインデントの 幅 を 揃 えないと 共 有 しにくい 31 一 行 の 桁 数 一 行 の 桁 数 に 制 限 を 設 ける だいたい80 文 字 程 度 式 の 途 中 で 改 行 する 場 合 は (バックスラッシュ)を 挿 入 する 一 行 が 長 すぎると 印 刷 をしたときに 折 り 返 しが 入 って 読 みにくい 32 16
コメント クラス モジュールやメソッドの 仕 様 をRDocスタイルで 記 述 する RDocとはRubyのソースを 解 析 し クラス モジュール メソッドの 定 義 と それらに 記 述 されたコメントからドキュメントを 生 成 するアプリケーション 例 # Fooクラスの 仕 様 class Foo # barメソッドの 仕 様 def bar... 33 構 文 に 関 する 規 約 メソッドの 定 義 クラスメソッドの 定 義 メソッド 呼 び 出 し ブロック 条 件 分 岐 論 理 演 算 子 同 じ 処 理 を 異 なる 書 き 方 で 記 述 できる 場 合 34 17
メソッドの 定 義 メソッド 定 義 の 仮 引 数 リストには 括 弧 を 付 ける 例 # 悪 い 例 def foo bar, baz # 良 い 例 def foo(bar, baz) Rubyは 仮 引 数 リストの 括 弧 を 省 略 できる 仮 引 数 リストに 括 弧 を 付 けないと 見 にくい 35 クラスメソッドの 定 義 (1/3) クラス 名 に 依 存 しない 形 でクラスメソッドを 定 義 する クラスメソッドはクラスから 直 接 呼 び 出 すことのできるメソッド C++やJavaでいうstaticメソッド 的 に 使 われる クラスメソッドの 例 class Foo def self.bar puts "class method bar" def Foo.baz puts "class method baz" Foo.bar #=> class method bar Foo.baz #=> class method baz barもbazも 定 義 の 仕 方 は 違 うが 同 じクラスメソッド 36 18
クラスメソッドの 定 義 (2/3) クラス 名 をFooからQuuに 変 更 class Quu def self.bar puts "class method bar" def Quu.baz # クラス 名 が 変 わったので 変 更 puts "class method baz" bazのようにクラスメソッドを 定 義 するとクラス 名 を 変 更 したときに 定 義 を 書 き 換 える 必 要 がある 変 更 のし 忘 れでエラーとなりやすい クラス 名 に 依 存 しない 形 でクラスメソッドを 定 義 する 37 クラスメソッドの 定 義 (3/3) 複 数 のクラスメソッドを 定 義 する 場 合 以 下 のようにクラスメソッド を 定 義 するのが 簡 単 class Foo class << self def bar def baz 38 19
メソッド 呼 び 出 し 引 数 を 持 つメソッドの 呼 び 出 しの 括 弧 は 省 略 しない 例 # 悪 い 例 def foo(x, y) def bar(z) foo 1, bar 2 #=>SyntaxError foo bar 2, 1 #=>ArgumentError # 良 い 例 def foo(x, y) def bar(z) foo(1, bar(2)) foo(bar(2), 1) 括 弧 を 付 けてメソッドの 引 数 を 明 示 しないとエラーが 起 きる 39 ブロック ブロックには 以 下 のように2 種 類 の 書 き 方 がある array.collect do i array.collect{ i } ブロックの 使 用 例 [1, 2, 3, 4].collect do i i*2 #=> [2, 4, 6] [1, 2, 3, 4].select{ i i%2 == 0 } #=> [2, 4] ブロックの 引 数 iに 配 列 の 要 素 が1つずつ 渡 されながらブロックの 処 理 が 実 行 されます 40 20
ブロック 一 行 のときは {} を 使 用 し 複 数 行 のときは do を 使 う do を 使 うときはメソッドチェインしない 例 array.collect do i i.to_s array.collect{ i i.to_s }.join(",") 41 条 件 分 岐 (1/4) if/unless 式 if cond do_something unless cond do_something if 式 は 条 件 式 condが 真 のときdo_somethingを 実 行 する unless 式 は 条 件 式 condが 偽 のときdo_somethingを 実 行 する if!x のような 場 合 は unless x を 使 うなど 条 件 式 がより 簡 潔 に 書 ける 方 を 使 用 する 42 21
条 件 分 岐 (2/4) if/unless 修 飾 子 do_something if cond do_something unless cond if 修 飾 子 は 条 件 式 condが 真 である 場 合 do_somethingを 実 行 する unless 修 飾 子 は 条 件 式 condが 偽 である 場 合 do_somethingを 実 行 する 43 条 件 分 岐 (3/4) 複 数 行 の 式 にはif/unless 修 飾 子 を 使 用 しない 複 雑 な 条 件 式 の 場 合 if/unless 修 飾 子 を 使 用 しない 例 array.collect do i if x array.collect{ i } if (foo && bar) (baz && quu) 44 22
条 件 分 岐 (4/4) case 式 を 使 用 した 方 が 簡 潔 に 記 述 できる 場 合 は case 式 を 使 用 する 例 # 悪 い 例 if x == 0 elsif x == 1 elsif x == 2 x == 3 # 良 い 例 case x when 0 when 1 when 2, 3 45 論 理 演 算 子 論 理 演 算 子 の 優 先 順 位 はそれぞれ 異 なるため 括 弧 を 明 示 する 論 理 演 算 子 : &&,,!, and, or,not 例!(true && false) #=> true! true && false #=> false 46 23
同 じ 処 理 を 異 なる 書 き 方 で 記 述 できる 場 合 書 き 方 を 統 一 する 例 for i in [1, 2, 3, 4] puts i [1, 2, 3, 4].each do i puts i 書 き 方 は 異 なりますが それぞれ 1 2 3 4 と 出 力 します 47 おわり 24
おわり コーディングルールを 決 めることで 書 き 方 に 適 度 な 縛 りがあると 開 発 しやすくなると 思 います 続 きはWebで http://shugo.net/ruby-codeconv/codeconv.html 49 カラーパレット 50 25