PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

業務屋とコンストラクタ

c#

コンストラクタで例外を投げるなという話はどこかで聞いたことがあると思います。
だからって以下のように書くと

public TheConstructor() {
    try {
        // 何らかの処理
    } catch {
        // 握り潰す
    }
}

・・・多分、同僚に殴られます。リソースを管理してくれるマネージ環境で開発していると大抵の資源は確保しても自動で(いつか)解放してくれるのでコンストラクタが例外を投げて困ることもあまりないかと思います。

が、そうやって安心できるからこそ出てくるのが次のパターン

public TheConstructor(string address) {
    // サーバーに接続するためのオブジェクトを生成
    this.clinet = new MyServer(address) { Port = 30005 };
    // サーバーとの接続を確率する
    this.client.Open();
}

こうすると誰からも殴られないと思います。だけど本当にいいんですかね?

このクラス(≒概念)のインスタンスがこの世に生まれるのに本当にサーバーの存在は必要でしょうか?ほとんど大抵の場合、必要ないと思います。クライアントのインスタンスはサーバーの存在に関わらず生成できるべきであって本当に例外が発生するのはこのクラスの利用者がOpenメソッドを使ったときだと思います。

なので可能であれば、こんな感じに

public TheConstructor(string address, int port) {
    this.address = address;
    this.port = port;
}
public void Open() {
    // サーバーへの接続処理
}

として利用者がどうするか次第としておいたほうがよいかと思います。

広告を非表示にする