この記事は、 @jnchitoさんのアドベントカレンダーのRubyプログラミング問題にチャレンジ!の12月5日の担当分です。
詳しいレギュレーションは、問題のGitHubのURLを参照してください。
PRのURL
ロジックの解説
用語
名前 | 英語 | 説明 |
---|---|---|
マス | square | 点字の中の一つの点 |
点字 | Tenji | マスが一つの組み合わせになったもの 点字の組み合わせで文字に対応している |
マーク | mark | 点字を組み合わせた単語(文字列) |
点字のルール
点字は、縦3点、横2点の6点の組み合わせで作られています。そして、この単位をマスと言います。
下の図をみてください。この図の①②④の点を組み合わせて母音を表し③⑤⑥の点を組み合わせて子音を表します。
引用元 全視情協
クラス説明
TenjiMaker
今回の問題のmain関数である、TenjiMaker.to_tenji(text)
を定義しています。
可読性を高くするために抽象度が高く理解容易性が高くなるようにしています。
自分は点字を一文字単位で扱っているため点字が複数ある、TenjisMaker
としたほうが自然だと思いますが、問題のルール上単数形のTenjiMaker
になっています
Tenji
クラスの説明
点字を表しているクラスです。
このクラスは表示する文字列 "○" とかと関係性をもっていないので、
例えば出力をコンソール(CLI)ではなくて、ブラウザ(HTML)に変更する仕様追加が発生した場合も柔軟に対応できると思います。
や行について
や行は特殊なルールがありますが、そのルールはや行だけなのでロジックを実装するとわかりづらくなったり、バグが発生する可能性があるためハードコーディングをしています。
MarkBuilder
渡された点字をもとに表示するマークを生成します。
このクラスはマークを生成することに特化しているクラスなので、状態を持たないイミュータブルなクラスにしています。
(Railsでいうサービスクラスです)
テストのメソッド名について
自分は英語が苦手なのと、このコードを見る人の殆どは日本人だと思います。
そのため、テストのメソッド名については日本語で補足を書いています。
コードのアピールポイント
- 頑張ったところ
- マーク(コマンドで表示する文字列)を生成する部分が点字を複数組み合わせて行の文字列を生成するので、直感的な仕様ではないです
- そのため実装するのが少しだけ大変でした
- 苦労したところ
- MiniTestをはじめて扱うのでキャッチアップやRspecとの書き方の違いが少しだけわかりづらかったことが苦労しました
- 工夫したところ
- コードとこのドキュメントがあれば、点字について理解できるように意識しました
- 自慢したいところ
- 拡張性もあると思うのでもし今後、複雑な点字のルールを実装することになっても実装しやすいのではないかと思います
- 点字についてわからないエンジニアでもコードを理解しやすいのではないかと思います
- 点字のルールはTenjiクラスをみればわかると思います
- 表示する文字列(マーク)についてはMarkBuilderをみればわかると思います
伊藤さんにメッセージ
- 点字については全くの知識がなかったのですが、今回の実装した範囲内であれば説明できるようになったので、少しだけ点字が身近に感じました
- 著名な方にレビューをしてもらうのはじめてですので緊張していますw