B-Teck!

お仕事からゲームまで幅広く

【デザインパターン】デザインパターンの勉強中メモ 振る舞いに関するパターン

Chain of Responsibility パターン

あるリクエストの処理を行うオブジェクトを鎖状に繋ぎ、適切なオブジェクトに処理させるパターン。
リクエストを受け渡す先を動的に切り替えることで、処理自体も動的に入れ替えることができる。
それぞれのオブジェクトは自分自身と、リクエストを受け渡す先のみを知っていれば良い為変更を行いやすいが、
全体を俯瞰することは難しくなる。

Command パターン

行いたい処理やパラメータ自体をオブジェクト内に隠蔽し、利用側が呼び出して処理を実行するパターン。
実際の処理はCommandオブジェクトごとに定義されているので、動的な変更や処理の切り替えに対応しやすい。

Interpreter パターン

Compositeパターンを文法や構文解析の結果の処理を目的として実装したもの
一つの文法規則を一つのクラスで表すことで、規則の追加や変更が簡単に行える。

Iterator パターン

集合に、要素に順番にアクセスできるようなインターフェースを持たせるパターン。
集合オブジェクト自身にインターフェースを持たせているので、
利用側はメソッドを呼び出すだけで内部の要素に順番にアクセスできる。

Mediator パターン

オブジェクト同士の相互作用を仲介するためのハンドリング用オブジェクトを用意するパターン。
各オブジェクトが直接相互作用を与えあう場合、影響のある箇所や全体像が把握しづらく、
拡張しづらいプログラムになってしまうので、それを避けるためのパターン。

Memento パターン

オブジェクトの内部状態を保存しておき、
必要に応じて書き戻すことで元の状態に戻すことができるようにするためのパターン。
単純にオブジェクトをcloneするのではなく、必要な状態やパラメータのみを保持する。

Observer パターン

オブジェクトの状態に変化があったときに、それを他のオブジェクトに通知するためのパターン。
パターン名は観察者という意味だが観察される側が通知を行うという事を定義している。

State パターン

オブジェクトの状態自体をオブジェクトとして切り出し、個々の状態の動作を別々に扱えるようにするパターン。
オブジェクトに状態オブジェクトを付与することで、現在の状態に応じた振る舞いをすることができる。
Strategyに類似しているが、Stateは状態に応じて振る舞いやアウトプットが変わるパターンである。

Strategy パターン

一連のアルゴリズムを実装したオブジェクトを複数用意しておき、
状況に応じてアルゴリズムを切り替えられるようにするパターン。
Stateに類似しているが、Strategyは同じふるまいをするときに、実際に行う処理を切り替えるパターンである。

Template Method パターン

全てのクラスに共通する処理を抽象クラスに実装し、変更可能性のあるメソッドをインターフェースとするパターン。
実装されたサブクラスによって行われる処理が切り替わる。

Visitor パターン

データ構造を保持するクラスと処理を行うクラスを分離するパターン。
データ構造側はどのような処理を行うかを知らなくても処理を実行することができる。
処理を行うクラスは、データ構造内の探索方法と処理自体を知っていれば処理を実行することができる。

【JavaScript】指定した文字列を繰り返した新しい文字列を生成する

ES6が使える環境ならこれでOK。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

console.log("test".repeat(3));
// testtesttest

ES6が使えない環境なら、先述したMozillaのサイトのpolyfillを利用するか、
エラー等を考慮しないなら下記のような方法で実現できる。

const repeat=(str,num)=>{
  return Array(num+1).join(str);
}
console.log(repeat("test", 3));

repeat関数はちょっと面白いことをしていて、
指定の数の空要素を持った配列を生成して繰り返したい文字列でjoinすると、
空要素を繰り返したい文字列で結合したことになって結果的に繰り返し文字列が得られると言う処理。
すげー発想だと思う。

https://stackoverflow.com/questions/1877475/repeat-character-n-times/1877479#1877479

【歴史/雑学】その他ローマの暦に関連したTips

前2記事に書けなかったけど調べてて気になった話とかいくつか。

JuliusとAugustusをあとから挿入したため2ヶ月ずれたという俗説は誤り

当初はMartiusが年の始まりだったが、
途中でJanuariusが年の始まりの月になったため、
数字で月を表したQuintilis(現在残っている名称ではSeptember)以降は語源と対応する月数が2ヶ月ずれている。
あくまでJuliusとAugustusは名称が変わったのみ。

JupiterはZeusと同一視される神

ラテン語のJupiter(ユピテル)は、古ラテン語のJou-paterに由来しているという。
印欧祖語のDyēus-pətērから派生した言葉がJou-paterとなり、
Dyeusの部分が派生した部分がZeusと変化したと思われる。

グレゴリオ暦の制定の経緯

キリスト教の重要な祭典として復活祭が存在するが、
この祝祭日は規定に沿って移動する。
規定の内容は「春分の後の最初の満月からすぐの日曜日」となるため、
春分の日というのは大きな意味を持つ日付である。
ユリウス暦で元々制定されていた春分の日は3/25であったが、
正しくないということから3/11へ修正された。
しかし、そもそも1年に11分の誤差を持つという暦としての欠陥があったため、
正しく春分の日を設定するためには改暦が必要であるとの結論に至り、
グレゴリオ暦が制定された。

閏月・閏日

古代ローマでは、Februariusの月の23日には年末のお祭りとして、
Terminalia祭が行われていた。
この祭典は重要なものとして位置づけられていたため、
調整用の日付である閏月・閏日は祭典終了後に挿入されていた。
この慣習が現在も残っているため、うるう年の1日は2月に付加される。