<commit_before># Rubyによるデザインパターン

**Rubyによるデザインパターン (著: ラス・オルセン）**という本のサンプル集です。

この本は、Gofの23のデザインパターンの14個をカバーしています。

* [テンプレートメソッド](#template-method)
* [ストラテジ](#strategy)
* [オブサーバー](#observer)
* [コンポジット](#composite)
* [イテレータ](#iterator)
* [コマンド](#commands)
* [アダプター](#adapter)
* [プロキシ](#proxy)
* [デコレーター](#decorator)
* [シングルトン](#singleton)
* [ファクトリー](#factory)
* [ビルダー](#builder)
* [インタープリタ](#interpreter)
* [DSL:Domain Specific Language](#dsl)


----------------------------------------------------------------

## デザインパターン

### テンプレートメソッド<a name="template-method"></a>

目的/概要:
  * アルゴリズムに多様性をもたせたい場合に便利
  * 基底クラスに不変の部分を記述し、変わる部分はサブクラスに定義するメソッドにカプセル化する

やり方:
  1. アルゴリズム間で骨格となるメソッド(**テンプレートメソッド**)を定義した**基底クラス**を作成する
     基底クラスのテンプレートメソッドは、サブクラスのために標準実装をしておくか、raiseなどでサブクラスにオーバーライドを促すようにする。
  2. それぞれのアルゴリズムごとに**テンプレートメソッド**をオーバーライドした**サブクラス**を作成する

実例:
  * WEBrick
  * initializeメソッド - 初期化の最後にinitializeを呼び出すようにしている



### ストラテジ<a name="strategy"></a>

目的/概要:<commit_msg>Add basic principle<commit_after># Rubyによるデザインパターン

**Rubyによるデザインパターン (著: ラス・オルセン）**という本のサンプル集です。

この本は、Gofの23のデザインパターンの14個をカバーしています。

* [テンプレートメソッド](#template-method)
* [ストラテジ](#strategy)
* [オブサーバー](#observer)
* [コンポジット](#composite)
* [イテレータ](#iterator)
* [コマンド](#commands)
* [アダプター](#adapter)
* [プロキシ](#proxy)
* [デコレーター](#decorator)
* [シングルトン](#singleton)
* [ファクトリー](#factory)
* [ビルダー](#builder)
* [インタープリタ](#interpreter)
* [DSL:Domain Specific Language](#dsl)


----------------------------------------------------------------

## 基本原則

  * 変わるものを変わらないものから分離する
  * インターフェイスに対してプログラミングし、実装に対して行わない
  * 継承より集約
  * 委譲、委譲、委譲(delegation)
  * YAGNI(You Ain't Gonna Need It) - 必要になるまで作るな



## デザインパターン

### テンプレートメソッド<a name="template-method"></a>

目的/概要:
  * アルゴリズムに多様性をもたせたい場合に便利
  * 基底クラスに不変の部分を記述し、変わる部分はサブクラスに定義するメソッドにカプセル化する

やり方:
  1. アルゴリズム間で骨格となるメソッド(**テンプレートメソッド**)を定義した**基底クラス**を作成する
     基底クラスのテンプレートメソッドは、サブクラスのために標準実装をしておくか、raiseなどでサブクラスにオーバーライドを促すようにする。
  2. それぞれのアルゴリズムごとに**テンプレートメソッド**をオーバーライドした**サブクラス**を作成する

実例:
  * WEBrick
  * initializeメソッド - 初期化の最後にinitializeを呼び出すようにしている



### ストラテジ<a name="strategy"></a>

目的/概要:
{'fraction_non_alphanumeric': 0.22106261859582543, 'fraction_numerical': 0.0056925996204933585, 'mean_word_length': 4.7, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1610044', 'n_tokens_mistral': 1451, 'n_tokens_neox': 1385, 'n_words': 95}