2010年4月30日金曜日

C#始めました

研究室の勉強会を通じてC#を勉強することにしました。1ヶ月前に勉強会が始まりましたが、本格的にC#でコーディングしたのは今日が初めて。


とりあえず、今までやってきたJavaやActionScriptなどとの違いを分かった分だけ列挙すると



  • コンソール出力はConsole.WriteLine();
  • しかも、第1引数の文字列中に"{0}"と書いておくと、第2引数の値がバインドされる(printfと同様の使い方ができる。)"{1}"と書けば、第3引数の値がバインド
  • メソッド名はアッパーキャメルで定義。プロパティもアッパーキャメル
  • インターフェース名は一番先頭にIをつける。
  • 静的クラスとは、静的メンバ、静的メソッドのみを定義したクラスのこと
  • 特に、class宣言のときにstaticキーワードをつけるとインスタンス化を防げる(privateであるデフォルトコンストラクタを用意しなくてよい)
  • 静的コンストラクタとは、静的メンバ、静的メソッドやそのコンストラクタのあるクラスが初めてインスタンス化されるとき「のみ」に実行されるコンストラクタ。静的な値の初期化を行いたいときに利用。コンストラクタ宣言の前にstaticをつける。Javaで言うところのstaticイニシャライザと同じ使い方


というくらいだろうか

C#を勉強しつつ、Silverlightもマスターしてしまおう(`・ω・´)

2010年4月25日日曜日

Adapterパターン

Adapterパターンとは、提供されてるものを必要な形に適合する(Adapter)するように変換するパターンのことです。

例えば、提供する側をAdapteeクラス、ターゲットをTargetクラス、ターゲットに適合するように変換するクラスをAdapterクラスとすると、Adapterクラスは例としては
public class Adapter extends Adaptee implements Target {
    ・・・
    @override
    public String getValue() {
        // Adapteeクラスで用意されているメソッドを呼び、
        // "value: "というprefixをつけて返す。
        return "value: " + getSampleValue();
    }
    ・・・
}

のようになります。上の例はTargetクラスをimplement、Adapteeクラスを継承した形ですが、

public class Adapter extends Target {
    private Adaptee adaptee;
    ・・・
    public String getValue() {
        // Adapteeクラスで用意されているメソッドを呼び、
        // "value: "というprefixをつけて返す。
        return "value: " + adaptee.getSampleValue();
    }
  ・・・
}

のように、Targetクラスを継承して,Adapteeクラスに処理を移譲する形でも実装できます。

関連パターン
Bridgeパターン異なるクラス同士を結びつけるためのパターン。これも橋渡し役と言えそう
Decoratorパターン中身のインターフェースを変えずに作るのがDecoratorパターンで、異なるインターフェースをつなぐのがAdapterパターン

Iteratorパターン

Iteratorパターンとは、集合の中から要素を1つずつ数える(取り出す)パターンである。

要素を1つずつ取り出したいときは、集合(配列でも何でも良い)から直接for文などで処理を書くことがあるが、Iteratorを用意することでこの処理をIteratorに任せることができる。そして後はIteratorで用意されるメソッド(大体はnext()やhasNext())を利用するだけで良いので,集合クラスの実装を意識しなくて済むという利点がある。

集合クラスを利用する側において、直接for文を利用した場合は
// SampleAggregateクラスはSampleクラスのオブジェクトを要素として、それを複数個持つクラス
Sample[] samples = sampleAggregate.getArray(); // 集合クラスが持つ配列を取得
for (int i = 0; i < samples.length; i++) {
    ・・・
}
となるがこの場合だと、

  • 自分で数えないといけない
  • 配列以外の集合(例えばArrayList)に切り替わった場合、利用する側も修正する必要がある 

というデメリットがある。
Iteratorの場合は
Iterator itr = sampleAggregate.iterator();
while (itr.hasNext()) {
    sample = (Sample) itr.next();
    ・・・
} 
となり、上記2つのでメリットが克服できる。(もちろん、要素の管理方法が配列からArrayListに変わった場合はIteratorクラスは修正する必要があるが、集合クラスを利用する側は修正の必要がない)

 関連パターン:
「Visitorパターン」(勉強中)
Compositeパターン」再帰的な構造を取っているパターンなので、これにIteratorパターンを適用するのは難しい。
「Factory Methodパターン」 Iteratorインスタンス生成にFactory Methodパターンが使われることがある。

※気づいた点
この本のサンプルプログラムでは、hasNext()を利用せずにずっとnext()を使っていると、「ArrayIndexOutOfBoundsException」が発生し、「インデックスが範囲外である」ことを教えてくれるが、それよりも「NoSuchElementException(要素がありません)」の方が分かりやすいんじゃないかな・・・実際、Java APIのjava.util.Iteratorを見ると、後者の例外を投げてくれます。

 参考URL:Iterator(Java Platform SE 6)

デザインパターンの勉強始めました

より良いクラス設計ができるようにと思い,結城浩さんの「Java言語で学ぶ デザインパターン入門」を使って勉強することにしました。

デザインパターンとは、

  • GoFによって整理されたプログラミングのパターン
  • 利用することで,開発者たちに有益で豊かな語彙を与え、互いの意思疎通を容易にする
  • 再利用しやすく,機能拡張しやすいソフトウェアを作るための有益な技法

です。

去年に研究室でデザインパターン勉強会をやっていたそうですが、社会人の俺には無理な平日に実施しており参加できなかったので,独学でやることにしますた(´・ω・`)