GoFはどこへ消えた?

一時期プログラミングのデザインパターンというものが大流行しましたが、現在ではどのように評価されているのでしょうか?

https://jp.quora.com/%E4%B8%80%E6%99%82%E6%9C%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A8%E3%81%84%E3%81%86%E3%82%82

いわゆるGoFの話だとおもうけど,どうもならんよ.
オブジェクト指向における再利用のためのデザインパターン Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series)

物理学におけるニュートン力学と同じで,OOPの根幹を成すものの一つとして今も変わらずそこにある.*1


goto文不要論も広く認められて,それ以降のほとんどの言語から goto文がなくなった.今ではそれが当たり前なので,goto文が不要かどうかは話題に上らなくなった.それはgoto文不要論が正しいと評価されたからであって間違っていたからではない.多くの言語やライブラリにGoFのパターンが取り入れられていたとしても,やはり同じ事が言える.
quickソートくらいは標準ライブラリで提供されるようになり,自分で作ることはほとんどなくなった.それはquickソートが広く認められあまねく普及しただけで,quickソートの意義が失われたわけでもましてや時代遅れになったわけでもない.ましてやソートに関して議論するプログラマーがquickソートも知らないとかありえない.技術者がより進んだ技術を求めるなら,その元となった基礎技術を知らないことなどあろうか.

設計(デザイン)パターン

原則に加え、オブジェクト指向設計には「パターン」もあります。いわゆるGang of FourGoF)と呼ばれる、Erich Gamma、Richard Helm、Ralph Johnson、そしてJon Vlissides が、パターンについての画期的な作品を1995年に書きました。彼らの『Design Patterns』という本では、パターンは次のように説明されています。  

オブジェクト指向ソフトウェア設計において遭遇するさまざまな問題に対して、簡単でかつ明瞭な解を与える」ものであり「設計プロダクトの柔軟性、モジュール性、再利用性、および理解のしやすさをより高める」ために使えるものである注4。

デザインパターンの概念はとてつもなく強力です。一般的に共通する問題に同じ名前をつけ同じ手法で解決することで、あいまいなことが明確になります。デザインパターンによってプログラマー達は世代を問わず、コミュニケーションと共同作業ができるようになったのです。

パターンはすべての設計者の道具箱に入っています。よく知られたパターンそれぞれが、その解決しようとする問題に対するほぼ完璧なオープンソースの解決法です。しかし、パターンの人気が出たことで、初心者が一種の乱用をするようになりました。熱意があり余るあまりに、まったく正しいパターンを間違った問題に適用してしまうといったことが起きたのです。パターンを間違って適用すれば、当然、複雑で混乱を招くコードがつくられます。パターンそのものに責任はありません。道具を、その使われ方で非難しても意味がなく、使うほうが道具をマスターしなければならないだけのことです。

本書はパターンについての本ではありません。しかし、パターンを理解するための準備と、適切に選び使うための知識は身につけることができるでしょう。

完全に同意.*2


自動車におけるシートベルト(やエアバッグ)みたいなもので、有効性が認められたから「あって当然」みたいなことになってる.

最新の安全装備の流行は衝突軽減ブレーキや自動運転かもしれないが,シートベルトは今だ現役バリバリの技術だし,古くさい技術が時代遅れでも廃れたわけでもない.今現在も広い分野で標準採用されてるってことは,そういうことだ.


http://b.hatena.ne.jp/entry/s/jp.quora.com/%E4%B8%80%E6%99%82%E6%9C%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A8%E3%81%84%E3%81%86%E3%82%82

  • id:otchy210 流行が終わったという見方は出来るけど、フレームワークに巻き取られて概念は生きていて、フレームワークのベストプラクティスに従うと結局パターンを使っている、みたいな状況になっていると感じる。
  • id:fritzbeep むしろ、当たり前になりすぎて強調されなくなっただけだと思う。死んだパターンもあるように見えるけど、生き残ってるのもたくさんある
  • id:deep_one 類型をまとめることには常に価値がある。「こういうことをしたいと思った時にこういう解決をした人がいるんだな」というのは参考になる。丸写ししようとして失敗した人が酷評するだけ。
  • id:gabari あえていうと、フレームワークとか標準ライブラリを作る際には未だに有用だと思う。そんな人がどんだけ居るのか、と言われると微妙だけど。
  • id:cl-gaku あのパターンがこんなにきれいに実装されてる、と思うことが多くなってきてる気がする。意識せずとも恩恵を受けられるようになってきてる。
  • id:infobloga デザインパターンは、書いてれば自然に出てくるものだけど、知ってることで、付けるべき/避けるべき、クラス名とかメソッド名が分かる。その意味で必須の知識。
  • id:dalmacija コードの世界の流行りが「廃れる」と思う人は大体見る目がない。理解が進んでかたちが変わり、そうとは呼ばれなくなるケースが多い。挫折することもあるけど



かるく検索してみた.

"Design pattern" だけでも,ざっとこんな感じ.「なんたらパターン」の奴も含めたらもっと増える.

この中の何割かはGoFデザインパターンそのままではないだろうが,GoFデザインパターンと無関係だと主張するものは少ないだろう.

Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series)

Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series)

言わずと知れた原典.


Design Patterns

Design Patterns

  • 作者: Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides
  • 出版社/メーカー: Pearson Education India
  • 発売日: 2015/12/01
  • メディア: ペーパーバック
  • この商品を含むブログを見る
あ,ペーパーバックで再出版されてた.この時点でまだ売れると判断されてたって傍証になる.古い技術だが,廃れた技術でも時代遅れの技術でもない.現役バリバリ.


Head First Design Patterns: A Brain-Friendly Guide

Head First Design Patterns: A Brain-Friendly Guide

Design Patterns Explained: A New Perspective on Object-Oriented Design (Software Patterns Series)

Design Patterns Explained: A New Perspective on Object-Oriented Design (Software Patterns Series)


Design Patterns in Ruby (Addison-Wesley Professional Ruby Series)

Design Patterns in Ruby (Addison-Wesley Professional Ruby Series)

Design Patterns in PHP and Laravel

Design Patterns in PHP and Laravel

Hands-On Design Patterns with C++: Solve common C++ problems with modern design patterns and build robust applications

Hands-On Design Patterns with C++: Solve common C++ problems with modern design patterns and build robust applications

Hands-On Design Patterns with Delphi: Build applications using idiomatic, extensible, and concurrent design patterns in Delphi

Hands-On Design Patterns with Delphi: Build applications using idiomatic, extensible, and concurrent design patterns in Delphi

Hands-On Design Patterns with Kotlin

Hands-On Design Patterns with Kotlin

Mastering Python Design Patterns

Mastering Python Design Patterns

Practical Python Design Patterns: Pythonic Solutions to Common Problems

Practical Python Design Patterns: Pythonic Solutions to Common Problems

Go Design Patterns

Go Design Patterns


Hands-On Design Patterns with C# and .NET Core: Build clean, reusable and maintainable C# code easily (English Edition)

Hands-On Design Patterns with C# and .NET Core: Build clean, reusable and maintainable C# code easily (English Edition)

Django Design Patterns and Best Practices - Second Edition

Django Design Patterns and Best Practices - Second Edition

Hands-On Design Patterns with React Native: Proven techniques and patterns for efficient native mobile development with JavaScript

Hands-On Design Patterns with React Native: Proven techniques and patterns for efficient native mobile development with JavaScript

Hands-On Design Patterns with Swift: Master Swift best practices to build modular applications for mobile, desktop, and server platforms

Hands-On Design Patterns with Swift: Master Swift best practices to build modular applications for mobile, desktop, and server platforms

Node.js Design Patterns - Second Edition: Master best practices to build modular and scalable server-side web applications

Node.js Design Patterns - Second Edition: Master best practices to build modular and scalable server-side web applications

Vue.js 2 Design Patterns and Best Practices: Build enterprise-ready, modular Vue.js applications with Vuex and Nuxt

Vue.js 2 Design Patterns and Best Practices: Build enterprise-ready, modular Vue.js applications with Vuex and Nuxt


Data Science Design Patterns

Data Science Design Patterns

Angular Design Patterns: Implement the Gang of Four patterns in your apps with Angular

Angular Design Patterns: Implement the Gang of Four patterns in your apps with Angular

Haskell Design Patterns

Haskell Design Patterns

Scala Design Patterns: Design modular, clean, and scalable applications by applying proven design patterns in Scala, 2nd Edition

Scala Design Patterns: Design modular, clean, and scalable applications by applying proven design patterns in Scala, 2nd Edition

Design Patterns in Modern C++: Reusable Approaches for Object-Oriented Software Design

Design Patterns in Modern C++: Reusable Approaches for Object-Oriented Software Design

Making Embedded Systems: Design Patterns for Great Software

Making Embedded Systems: Design Patterns for Great Software

[
Pro Design Patterns in Swift

Pro Design Patterns in Swift

Learning JavaScript Design Patterns: A JavaScript and jQuery Developer's Guide

Learning JavaScript Design Patterns: A JavaScript and jQuery Developer's Guide

Pro JavaScript Design Patterns (Expert's Voice in Web Development)

Pro JavaScript Design Patterns (Expert's Voice in Web Development)

The JavaScript Design Patterns and Best Practices Collection (English Edition)

The JavaScript Design Patterns and Best Practices Collection (English Edition)

Hands-On Game Development Patterns with Unity 2019: Create engaging games by using industry-standard design patterns with C#

Hands-On Game Development Patterns with Unity 2019: Create engaging games by using industry-standard design patterns with C#



追記.

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

https://www.oreilly.co.jp//books/9784873118758/
和書の方はタイトルに「デザインパターン」を含むが,

Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services

Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services

原書の方には "design pattern" とは書いてない例.

設計でパターンの本だから当たらずといえど遠からずだが,分散システムに特化していて,GoFではない.


GoFは玉石混淆だったとは言え,広い分野(の基礎)を網羅していたが,こっちは特定領域専用.こういったパターン本もわりとあったりする.*3


Node.jsデザインパターン 第2版

Node.jsデザインパターン 第2版

https://www.oreilly.co.jp//books/9784873118734/
日本ではオライリーだけど原書は Packt.

*1:「カメラ付きケータイ」も最初はカメラが付いてることが最大の特徴だったけど,今じゃカメラがついてて当たり前だから,「カメラがある」ことは宣伝文句にならなくなってるようなもの.

*2:これは初版だが,第二版の原書でもほぼ同じまま記載されてるようだ.

*3:GoFの方が基礎,後から出てきたものは応用」という傾向はある.説明でもそう言い切れたら楽なんだが,そこまで単純ではないだろう.