Scala、Perl、Ruby、DDD、OOP等質問お待ちしております https://t.co/xNguWzLMOP
— magnoliak (@magnolia_k_) 2018年9月26日
スキルアップのためには、知らないこと、分からないことへチャレンジした方がいいですね。例えば、すぐに答えられそうか分からない質問をわざと受ける、というのも1つの方法です。
ということをツイートしていたら…
この非互換への正しい対処方法を教えてください。 https://t.co/tPMSdnTYhs
— seratch (ja) (@seratch_ja) 2018年9月29日
質問…というよりガチな依頼が来ましたので、これはこれで対応するしましょう(笑)。OSSへの貢献は、ソフトウェア開発を学ぶ上で必要な要素がたくさん詰まっていますからね。
対象のコードは何か?
- 対象は「Scalate」というScala用のテンプレートエンジン
- Scala 2.13.0-M5でコンパイルしたところコンパイルエラーが発生
- 従来、継承できていたメソッドがリファクタリングによりprivate化され、overrideできなくなった
起因となった変更は以下の以下のコミット
private化されたのはエラーメッセージの文字列を組み立てて、実際に出力するprintMessageというメソッド
元々のコードの意図を探る
- ScalateではテンプレートをScalaのコードとしてコンパイルする方法を採用
- コンパイルの際に発生したエラーや警告をConsoleReporterを継承したLoggingReporterを使って独自にエラーを蓄積
- 最終的にエラーが有ればCompilerExceptionを送出
エラーの蓄積のために、printMessageというメソッドをオーバーライド
(loggerという割にはログ出力は行っていないのは謎ですが…)
クラス構造の変更点を把握する
- Scala 2.13.0-M5よりConsoleReporterが大幅にリファクタリング
- クラス構造も変わり、ConsoleReporterに加えて、DisplayReporterというクラスが追加
- ConsoleReporterとDisplayReporterは、PrintReporterというtraitをmix-in
- PrintReporterがprintMessageを持つ構成となっているが、privateメソッド化されている
- printMessageはdisplayメソッドから呼び出される点は変わらず
変更案
- printMessageではなく、displayメソッドを継承
- printMessageの中で行っているメッセージ文字列の組み立てをログ出力用にコピペ
- 最後にエラーの件数を出力するためのprintSummaryメソッドが無くなったので、同等の機能を提供するfinishへの置き換え
printMessageの中で行っているメッセージ文字列の組み立てをコピペしているのでdryではないので、別の方法が有れば採用したいところですが、一旦素案レベルではできました。
ただし、まだScala 2.13.0-M5に対応したScalatestがリリースされていない関係で、この先のコンパイルでエラーが出るし、テストもできない状態なので、ここで一旦検討は終了です。
ここまで記録を残しておけば、scalatestが動くようになってから検討を再開できるかな。ちょっと面倒ですが、1つ1つ調べたこと、考えたことを記録しておかないとすぐ忘れちゃいますね。
終わりに
今回、お題を頂いた瀬良さんが執筆に参加されたScalaの入門本「 実践Scala入門」が発売されるそうです。これを読んでみんなもScalaのOSS開発に参加しよう!!
- 作者: 瀬良和弘,水島宏太,河内崇,麻植泰輔,青山直紀
- 出版社/メーカー: 技術評論社
- 発売日: 2018/10/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る