とある企業さんで丁寧にコーディングレビューの機会を設けて頂けてそれがとても感動&勉強になったので記録します。
問題
引数で与えられた文字列を空白の区切りごとに頭文字だけ大文字にするというものです。
例:hello programming world→→→Hello Programming World
私はRubyで挑戦しました。
def LetterCapitalize(str)
//ここに処理を書く
end
puts LetterCapitalize("hello programming world")
考え方
ご教授頂いたことで勉強になった事は考え方です。
「まずやりたいことを細かく分けて考えよう。コードを書きながら頭を整理する感じで書いてみるといいよ。」
「実際の現場では内容よりも先にコードを見て、その後に内容を詳しく話すことも多いから変数名やメソッド名はできるだけ分かりやすく、何を表しているのか誰が見ても分かるようにしよう。」
「そのほうが自分も何を実現したいのか頭が整理されて考えやすくなるよ」
ととても丁寧にご教授頂きました。
感動して勉強になり過ぎて泣きそうでした。
では実際にやってみます。
文字列を空白ごとに分ける
split
を使って空白ごとに文字列を分けます。
公式リファレンス
words = str.split
このsplitを使って文字列を分けたんだということが分かるようにwords
という変数名にしました。
ちなみにsplitは引数に(,)のように指定すればカンマごとに分けることもできるみたいです。
split
によっての出力結果は以下のようになりました。
hello
programming
world
はい。分けることができました。
分けた文字列の頭文字を大文字にする
capitalize
を使って頭文字を大文字にします。
公式リファレンス
words = str.split
words.map do |word|
word.capitalize
end
words
は配列になっているのでそれに対して1つずつ処理ができるようmap
を使います。
map
は配列の要素の数だけブロック内の処理を繰り返し値を書き換えるメソッドです。
公式がちょっと分かりにくかったのでこちら参考にしました→Rubyのmap, map!メソッドの使い方
そうすると出力結果は下記のようになります。
Hello
Programming
World
はい。全て頭文字を大文字にできました。
配列を結合させる
今は
words = [Hello, Programming, World]
という中身の配列になっているのでこれを結合します。
join
を使います。
公式リファレンス
join(' ')
とすれば空白で区切りかつ結合できます。
でもここでこのまま
words.join
とすると
hello programming world
と出力されてしまいます。
これはmap
が破壊的メソッドではないためmapで処理をした外に出ると、元々の文字列が書き換わっている訳ではないので元に戻ってしまっているのです。
ですので書き換えます。
words = str.split
words.map! do |word|
word.capitalize
end
words.join(' ')
上記のようにしてみると下記のように出力されます。
Hello Programming World
はい。できました。
ただし、破壊的メソッドは元の値をそもそも書き換えてしまうので使い方によっては危険であるという認識を持つようにとご教授頂きました。
番外編
じゃあ、もしcapitalize
がなかったらどうする?
自分で全て処理を書くとしたらどうするか?とワクワクする問題を出されて考えてみました。
def LetterCapitalize(str)
words = str.split
words.map! do |word|
letters = word.split('')
letters[0].upcase!
letters.join
end
words.join(' ')
end
puts LetterCapitalize("hello programming world")
まずwordsをmap!で繰り返すのは変わらず。
そのwordsの中身の[hello, programming, world]をさらにsplitで一文字ごとに分けます。
そしてupcaseで頭文字を大文字に変換します。
joinで文字を結合させます。
最後に文字列を結合させて完成です。
できた!
楽しい!
私はつい「これを実現するメソッドあるかな?」と探してしまうのですが、
今回みたいにメソッドがなくても実現できることにとても面白さを感じました。
メソッドに頼るから考えが浅いのだと痛感したので、今回を教訓にロジカルシンキングを鍛えて行こうと思います!
本当にこの企業さん神様みたいな対応してくれて感謝しております。
以上です。