m2

OOP についていろいろ考えて途中まで文章書いたけど面倒になってリンク集にした

<元ネタ>
実はオブジェクト指向ってしっくりこないんです!:気分はstatic!:エンジニアライフ

2010/4/30 引用を追加


Microsoft previous versions of technical documentation | Microsoft Docs
http://nakayalog.net/?p=63

・アクセス方法を制限する事により、オブジェクトがより独立したものとなる
・セットした値の妥当な値かをオブジェクト内でチェックしたり、変更したりできるので、望まない値が変数に格納されない
・そういう「作法」を作っておくと、大規模開発でもみんなが同じ作法でコードを書く事ができる

・外部に公開されていることを明示化できる
・ReadOnly アクセスレベルが指定できる

データ構造はクラスに任せた!だから、アルゴリズムはstatic関数で書くぜ!!(キリッ - みねこあ

普段サブルーチンを「インスタンスを作っている」なんて意識せずに使っているからピンとこないかもですが、サブルーチンのローカル変数 が進化したのが クラスのメンバ変数 だ! ・・と言えば、この2者の関係が比較的「アハッ!」しやすいかしら。

ということは、逆にクラスから見ればサブルーチンは コールと同時に インスタンスが自動的につくられて(=ローカル変数の領域が確保されて)、リターンと同時にインスタンスが解放される、特殊化(用途が狭められた)されたクラスに見えます。

実は単に型推論が欲しいという話

具象型のArrayListにだけ宣言されている メソッドが呼び出されることを防ぐことができます。(*1) 継承階層を用いて型の差し替えを可能としているわけですね。

つまり、ローカル変数のListをList型ではなくArrayList型の変数として宣言しようが、 メリットが生まれるケースはほとんどない。デメリットになるケースもほとんどない。

ただし、外部とのインターフェースとなる部分、つまり、メソッド引数やreturn値の型、 またインスタンスフィールドは厳密に抽象型を用いるべきです。

拡張メソッドのターゲットにIList(T)とIEnumerable(T)のどちらを選ぶか? - よねKENのプログラミング研究
http://yoshiori.org/blog/2006/12/javaiterator.php
http://d.hatena.ne.jp/t_yano/20070128/1170006946

それよりもyoshioriさんの言ってることの方がはるかに重要です。Iteratorは「繰り返す」という処理をリストの実装から切り離して提供することが目的です。実装に適した最適化はIteratorの中で行われてる。基本forによるアクセスはリストの実装に応じて方法を切り替える必要があるけど、Iteratorならその必要がない、というのが最大の利点なんです。拡張forループはそれを推し進めた形です。

「要素を次々と返す」という機能をオブジェクトとして提供して、その内部実装を隠ぺいするのがIteratorです。

TemplateMethodパターン
19.State パターン | TECHSCORE(テックスコア)
C# では文字列の比較に Equals を使うな

C# というせっかく型の恩恵を受けられる言語を使ってるんだから、最大限に活用した方がいい。

http://www.geocities.jp/objectbrain/donotneedobjectbrain.html

そもそも,オブジェクトとは何なのか.その起源は,Simula67という言語が編み出した

  「とってもへんちくりんな変数」

の種類なのだ.もともと,プログラミング言語の変数には「グローバル」というどこからでもアクセスできる変数しかなかった.プログラムは至る場所からこのグローバル変数を参照・変更することができた.
このカオス状態から逃れるために,構造化プログラミング言語では,「ローカル」という種類の変数を発明し,関数(サブルーチン,手続き)という1つのモジュールの中からしかアクセスできないようにした.そして,その領域取得と開放を自動的にスタック上で行うことができる機構(自動変数とも言う)を言語処理系に持ちこんだのだった.

さて,ここで,Simula67は,一つのいたずらを試みた.

  「この関数内のローカル変数の寿命を,グローバル変数のように長くできないだろうか?」

そして生まれたのが,「オブジェクト」というヒープメモリに動的に確保された領域と,それを指すポインタだ.オブジェクトは関数内で生成され,関数が終了しても生き残る.そして,ポインタを通じて他の関数からも参照することができる....なんて妙な生き物!

「社長起立」の正しく分かりやすい解説

http://jottit.com/jef57/

2010/4/30 追加


自作クラスの演算子をオーバーロードする - .NET Tips (VB.NET,C#...)
Microsoft previous versions of technical documentation | Microsoft Docs
事例で学ぶデザインパターン 第4回 Factory Method パターン 〜オブジェクト生成の柔軟性を導入する〜

C さん 「いやいや、どこまで柔軟性を高めるかということだけど、サブクラス化するとさらにクラスが増えて構造は少し複雑になるから、メリットばかりというわけではないんだ。複雑さと柔軟性のトレードオフだね。今回は柔軟性の方をとったけど、どちらが正しいというわけではないんだよ。」

そのため、デザインパターンのクラス構造をそのまま単に暗記するのではなく、解決したい問題や適用の目的やしっかり把握した上でクラス設計を行う必要があります。どちらかというと、設計時には「デザインパターンを適用しよう」という意識よりも、オブジェクト指向設計におけるクラスの責務分割の一環としてクラス設計し、デザインパターンは参考程度にとどめるという視点で捉えることも有効です。

OOPってなにがいいの?
  • 引数が減らせてウマー。