初心者向けにできるだけ噛み砕いてみるオブジェクト指向 vol.3 コードの変更に対応する

はじめに

これまで、vol.0vol.1vol.2とたとえ話が続いているので「で、実際にコードではどうなるの?」と気になってくるのではないかと思います。これから複数回に分けて、実際にコードを書いていきながら確かめていきましょう。今回はコードに起こる変更のイメージを感じていただけたらと思っています。オブジェクトっぽいコードはまだ出てきませんので「こんなの楽勝!」という方は読み飛ばせるかもしれません。

シチュエーション

私は先輩プログラマに依頼されて、システムの一部の処理を書いています。まだ仕様は確定していないそうで、サンプルのコードを書いておき、そこから都合のいい部分を本当のシステムに移植するらしいです。先輩は「移植しやすいように作れよ」と言っていました。

ある規則に則って文字列を加工するのが私の担当箇所です。

ストーリー

お題0: カンマ区切り

「カンマで区切られている文字列を、標準出力に出す」 とりあえずこれを言われたので、下記のようなコードを書いてみました。

# 準備された入力の文字列をカンマ区切りで区切って一行ずつ出力する
str = "りんご,みかん,バナナ,いちご"

# ここの処理を作る
puts str.split(',')

どうやらこれはこれで良さそうです。初歩的な内容で書ける処理でしたね。

お題1: 数字と一緒に出力する

どうやら出力のフォーマットが決まってきた様子で、見やすいように行の先頭にインデクスを付けて出すようです。 というわけで、コードを変えてみました。

# 準備された入力の文字列をカンマ区切りで区切って
# 一行ずつインデクスと一緒に出力する
str = "りんご,みかん,バナナ,いちご"

# ここの処理を作る
str.split(',').each_with_index do |fruit, index|
  puts "#{index}:#{fruit}"
end

each_with_indexがわかれば大丈夫でした。

お題2: カンマとコロンに対応する

今度は入力の文字列のフォーマットも変わる様子です。カンマだけではなくて、コロンで区切られることもあるらしいです。 splitは正規表現にも対応している様子なので、一箇所の変更で済みました。

# 準備された入力の文字列をカンマまたはコロン区切りで区切って
# 一行ずつインデクスと一緒に出力する
str = "りんご:みかん,バナナ:いちご"

# ここの処理を作る
str.split(/[,:]/).each_with_index do |fruit, index|
  puts "#{index}:#{fruit}"
end

先輩によると、入力の文字列のフォーマットと、出力のフォーマットはまだ変更されるかもしれないとのことです。

お題3: HTMLタグとして出力する

出力をHTMLで出せないかと依頼があったので、次はこんなコードを書きました。ちょっとした改変でulタグにできて良かったです。

# 準備された入力の文字列をカンマまたはコロン区切りで区切って
# HTMLのULタグとして出力する
str = "りんご:みかん,バナナ:いちご"

# ここの処理を作る
puts '<ul>'
str.split(/[,:]/).each do |fruit|
  puts "<li>#{fruit}</li>"
end
puts '</ul>'

お題4: 状況によって出し分ける

先のお題はちょっと勘違いをしてしまいました。「HTMLでも出せるように」ということで、出し分けが必要だったんですね。条件分岐をするのだろうと思い、下記のようなコードを書きました。

# 準備された入力の文字列をカンマまたはコロン区切りで区切って
# HTMLのULタグとして出力する
str = "りんご:みかん,バナナ:いちご"
output_type = :ul
# output_type = :indexed # インデクス付きならこちら

fruits = str.split(/[,:]/)

if output_type == :ul
  puts '<ul>'
  fruits.each do |fruit|
    puts "<li>#{fruit}</li>"
  end
  puts '</ul>'
elsif output_type == :indexed
  fruits.each_with_index do |fruit, index|
    puts "#{index}:#{fruit}"
  end
end

先輩はあんまりいい反応ではなくて「これはこれで良いけれど、今後、出力の方法が増えるとif文がずっと続くの?ブツブツ…」みたいな感じなんですね。うーん、どうしたら良いんでしょう。

おしまいに

説明しやすいようにお題の内容はかなり簡単な処理です。本来はもっと複雑な処理の方が恩恵はあるのですが、最初は理解しやすいコードで感覚をつかんでいただければと思い、上記のような内容にしています。 実際の現場でお題4のコードでダメ出しされるのは、出力方法が余程変化するシステムでなければ無いと思います。長くなったので次回から上記のコードをより良い形に変えていきます。

一連のコードは下記から取得できます。

github.com

PR

TECH DRIVE協賛企業のサークルアラウンド株式会社では、プログラマーの成長を加速させるためのトレーニングを行なっています。フロントサイドからバックエンドまで各種バリエーションがございますので、ご興味がある方は是非以下のリンクより詳細をご覧ください。

JavaScript Climbing

JavaScriptに特化したトレーニング「JavaScript Climbing」を行なっています。
this、クロージャ、Class等、中〜大規模のフロントエンドの開発に臨にあたり、必須となるスキル習得を現役のWEBエンジニアが徹底してサポートします。
2週間の無料体験期間がございますので、ご興味がある方は是非以下のリンクより詳細をご覧ください。

circlearound.co.jp

Ruby Climbing

週1からはじめられる「Ruby」でWEB開発の基礎が習得できる塾です。現役のプログラミング講師&Rubyエンジニアがプログラミング入門からフレームワーク(Sinatra/Ruby on Rails)を使用した本格的なWEB開発の学習までをしっかりとサポートします。

ruby climbing

個別トレーニング

短期間でぐっと成長したい方は弊社主催の個別トレーニングがおすすめです。 トレーニング内容は、受講者の方の課題/要望をお伺いした上で、フルオーダメイドで作成させていただきます。 詳細は以下のリンクよりご確認ください。(応募者多数の場合には時間を別途ご用意する予定です)。

WEBプログラミング個別トレーニング

チーム開発トレーニング

既にある程度コーディングが可能なのでチーム開発を経験してみたいという方にはチーム開発トレーニングがおすすめです。 GitHub Flowを使用し、実践の開発フローを体験していただきながらスキルアップ可能なトレーニングとなっています。

WEBサービスチーム開発トレーニング

TECH DRIVEについて

TECH DRIVEは「技術者の成長を加速させる」をキーワードに都内で活動をしているコミュニティです。
TwitterやFacebookにて技術ネタやイベント情報の発信を行っていますので、ご興味があれば、いいねやフォローをお願いいたします。