概要
tmgen問題 『コピペシステム社の粗悪システムを改修』 出題開始
詳細
tmgen問題 『コピペシステム社の粗悪システムを改修』 の出題を開始しました。
https://codeiq.jp/ace/tbpgr/q625
tmgen=Template Methodパターン Generator問題の略です。
解答方法をレベルごとに4種類用意したので選択肢次第では上記に当てはまりませんが。
問題の解答期限終了に各自が提出したコードをブログやGitHubへ公開するのは大歓迎です。
後述のハッシュタグを付けてTweetすると他の参加者と情報共有しやすいと思います。
Ruby使いの先輩方へ
解答に関してですが、まだまだビギナーRuby使いなのでもっと良い記述方法があると思います。
自分の出す答えは模範解答ではなく、解答例だと自覚しております。
「こうやるといい!」などご指摘いただけると嬉しいです。
Ruby使い以外の方へ
採点の都合等もあり、Rubyによる出題になりました。
文法的に言語特有の部分はそれほど多く必要としない問題なので
Rubyデビューのきっかけにいかがでしょうか?
今年もそろそろ終わりますし、達人プログラマーの「1年1言語」の選択肢としてもRubyはオススメです。
自分も1年1言語の選択肢としてRubyを選び、Rubyが手放せなくなって仕事でも使いたい
と思っていた矢先、機会に恵まれてJavaの開発からRubyの開発ができる会社に転職しました。
自分の言語でこの問題を解きたい!という方は問題の解答期間終了後に
ブログ+GitHubで公開して #CodeIQ #tmgen に呟くなどすれば関係者の目に留まるかもしれません。
出題関係者は CodeIQ 関連のツイートをよくチェックしていると思います。
様々な方の目にとまること自体セルフブランディングに繋がることと思います。
解答方法ごとのポイント
・解答方法1:ベタ書き
まずはレガシーシステムのコピペコードに比べれば差分だけ実装すればよくなるため
開発・保守時のコストがある程度下がります。
・解答方法2:自動生成
解答方法1による利点はそのまま受け継ぎつつ、大量のクラスを実装しなければいけない場合に
自動生成処理を1ファイルだけ作成すればクラス数分のファイルを生成できます。
ただし、楽を出来るのは初期リリース時のみで保守時には解答方法1の方法で手動で作成する必要が出てきます。
・解答方法3:メタプログラミング
動的にクラスを定義することで、解答方法1の場合と比べてクラスやメソッドの宣言部の重複した記述や
手動でファイルの作成をする手間が不要になります。
今回はテストクラスをばらばらに用意していますがこのパターン用のテストクラスを1つ作れば、
テストケースを追加するだけで保守可能になり、
プロダクトコード、テストコード共に保守コストを大きく削減できます。
この方法は初期リリース時、保守時共に効率を上げる方法であるため一番評価を高くしてあります。
※この問題はシンプルな例だからいいですが、あまり複雑な仕様に対してこの方法を適用すると
かえって保守性が下がる恐れもあります。
その際は多少コードが長くなっても可能な限り可読性をあげたほうが良いと思います。
・解凍方法4:自由解答
全く新たな解決の発想をお待ちしています。
解答に関する補足
・選択した解答方法を問わず問題文の曖昧さなどの裏をついて
解答し、こちらの想定していた解答例と異なっていた場合でもテストにパスしていれば同様に評価を付けます。
むしろ新たな視点を見せてもらえるので好印象・高評価です。
経過情報
挑戦経過等を個々に反映予定。
2014/01/13 受付完了
挑戦者数:16
※複数の解答にチャレンジしてみたい!というかたはすべての解答を
送って頂いても問題ありません。正解した中で一番評価の良いもので採点します。
解答方法 | 人数 |
---|---|
1 | 1 |
2 | 4 |
3 | 11 |
4 | 0 |
Ruby未経験の方へ
問題挑戦へのステップ
・Rubyのインストール
下記Ruby公式サイトのドキュメントを参照して、インストールしてください。
https://www.ruby-lang.org/ja/downloads/
・Bundlerのインストール
コマンドラインで
gem install bundler
あくまで問題への挑戦の最低限の情報のみにしています。
Bundlerに関して詳しく知りたい場合はGoogle先生に聞いてください。
・Bundlerを利用して必要なライブラリのインストール
before, after直下で
bundle install
を実行。※installは省略可。
他にも細かいオプションがありますが今回は割愛。
・RSpecのテスト実行方法
bundle install実行後,before, after直下で下記コマンドを実行
rspec
以上です。