パターン指向リファクタリングのワークフローはドメイン駆動設計のアイデアに似ている
Martin Fowler氏によるリファクタリングのワークフローの記事が面白かったのでメモ。
【元ネタ】
Martin Fowler氏によるリファクタリングのワークフロー
TDDには黄金律(Red→Green→Refactoring)というワークフローがある。
つまり、テスト駆動開発とリファクタリングは密接に関連している。
テスト駆動開発・実践編01・黄金の回転 - Strategic Choice
テスト駆動開発の概要とメリット ? 実践テスト駆動開発一人読書会(1) ? mizoguche.info
リファクタリングは、反復的な設計手法でもある。
最初から完璧な設計ではなく、動くコードを徐々に洗練させながら、より良いコードへ変えていく。
つまり、進化的設計の手法の中にリファクタリングが組み込まれている。
「パターン指向リファクタリング入門」は、GoFのデザインパターンとファラーのリファクタリングを結びつけた本だ。
アイデアとしては、パターンを、新しい設計の初期段階ではなく、既存の設計を改善するのに用いる。
さらに、パターンを使って設計を改善する時に、コードレベルの設計の変換、つまり、リファクタリングを使う。
(引用開始)
Joshua Kerievsky氏は著書「パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法」の中でこう提案した。
継続的にコードの設計を改善していくことで、どんどんそのコードを扱いやすくなる。
これは、ほとんどリファクタリングせず、便宜上新しい機能を追加する際に多大な注意を払う、というようなよくある状況とは雲泥の差だ。
もしあなたに継続的リファクタリングの衛生的習慣が身についたなら、いかに拡張や維持が容易になるかよく分かるだろう。
リファクタリングは今や周知の手法だとFowler氏は述べているが、多くのチームはリファクタリングの際に使用できる様々なワークフローをより良く理解する必要がある、と彼は示唆している。
そうすることで、それぞれの状況に一番合ったものを適応出来るからだ。
(引用終了)
「リファクタリング」によれば、ファウラーは、パターンは目指そうとする所であり、リファクタリングは、どこか別のところからそこへ到達する方法、と言っている。
これは、リファクタリングの結果出てきた構造が実はパターンである、ということを意味していると思う。
この話はドメイン駆動設計の話に似ている。
ドメイン駆動設計において、浅いモデルを洗練させていくと、ある時、ブレイスクルーが起きて、深いモデルに変わる瞬間がある。
すると、深いモデルでは、ドメインエキスパートと開発者はユビキタス言語で会話できるようになる。
つまり、動くけれども汚いコードをリファクタリングしていくうちに、シンプルな構造になり、ブレイクスルーが起きた時、パターンが自然に現れてくることを意味しているのだろう。
パターン指向リファクタリング入門を突き詰めると、下記の3つのワークフローに集約されるらしい。
(1)新しいタスクを始める際に適応する"Preparatory(予備の)リファクタリング"
(2)広範囲において多大な注意を払う必要があるような問題のあるコードが存在する場合に適応する"Planned(計画的)リファクタリング"
(3)複数回の反復を通して大きなモジュールをリプレースする際に適応する"Long-Term(長期の)リファクタリング"
上記の3つのリファクタリングのワークフローは、ドメイン駆動設計の蒸留プロセスの連想させる。
「パターン指向リファクタリング入門」は実際のコードを使って、リファクタリングとデザインパターンを絡めたパターン集になっているが、そのアイデアを突き詰めて抽象化させると、上記3種類のワークフローに収斂させるのだろうと思う。
他にも色々考えてみる。
| 固定リンク
「プログラミング」カテゴリの記事
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
- JavaSilverの感想~Javaはオブジェクト指向と関数型言語の2つの性格を持つ(2022.07.06)
- Javaのenum型はシングルトンクラスみたいだ(2022.06.20)
- 「コーディングを支える技術」は良い本だ(2022.05.26)
- 「RubyやRailsは終わった」という記事のリンク(2022.01.09)
「モデリング」カテゴリの記事
- 組込みソフトウェア開発でUMLを使う手法を説明した書籍のリンク(2022.06.17)
- 超高速開発でアジャイル開発を実現する話に違和感がある(2022.05.06)
- 事業活動のシステム化は非差別化しない汎用ドメインや支援ドメインに注力すべき(2022.04.13)
- 「大国政治の悲劇」の感想~現代はパワーポリティクスの歴史に戻ったみたいだ(2022.03.25)
- マイクロサービスはアトミックな操作で閉じるべきシステム分割論に基づいたアーキテクチャなのか(2022.03.20)
「ソフトウェア工学」カテゴリの記事
- Javaのラムダ式の考え方(2022.08.10)
- テスト管理ツールTestRail、CAT、QualityForwardの感想(2022.07.30)
- メトリクス分析のコツは良いIssueを見つけること(2022.06.29)
- プロセス設計はどの範囲を指すのか?~プロマネの仕事はテーラリングにある(2022.06.19)
- 「大人の学びパターン・ランゲージ」の感想~知識と経験を行ったり来たりするタイミングを大切にする(2022.06.05)
「Agile」カテゴリの記事
- 組織を芯からアジャイルにする対談の感想~今のアジャイルは先カンブリア時代なので何でもいい、アジャイル警察はいらない(2022.08.05)
- 製造業の業務にスクラムを適用できるのかという疑問~全てのビジネスモデルにスクラムを適用できるのか?(2022.07.31)
- 認定スクラムプロダクトオーナー研修の感想(2022.07.28)
- プロセス設計はどの範囲を指すのか?~プロマネの仕事はテーラリングにある(2022.06.19)
- 小説活動にプルリクエスト駆動が必要になってきた(2022.05.08)
「パターン言語」カテゴリの記事
- 「大人の学びパターン・ランゲージ」の感想~知識と経験を行ったり来たりするタイミングを大切にする(2022.06.05)
- 知識は経験よりも大切か、経験は知識よりも勝るのか、SECIモデルは相互作用を語る(2022.04.26)
- 「ハリウッドリライティングバイブル」のマインドマップ(2022.01.23)
- 【資料公開】チケット駆動開発の解説~タスク管理からプロセス改善へ #redmine(2022.01.14)
- チケット駆動開発のプロセスとチケット管理システムの全体像 #Redmine(2021.12.28)
コメント