アカウント名:
パスワード:
私感だけど、オブジェクト指向というのは、再利用するライブラリを作成する場合は威力を発揮するのはよく分かる。しかし、再利用しない場合は不要だし、多人数で開発する場合は他人とのインタフェース部分だけオブジェクト指向的にすれば十分だと思う。他人に見せない内部まで生真面目にオブジェクト指向で作ったら、むしろコードサイズが大きくなり。処理が分散することで、かえって可読性が落ちる。
オブジェクト指向というのは、再利用するライブラリを作成する場合は威力を発揮するのはよく分かる。
発揮しません。再利用性で重要なのは、汎用性のある仕様です。オブジェクト指向で作ろうが、使えないものは使いたくありません。
他人に見せない内部まで生真面目にオブジェクト指向で作ったら、むしろコードサイズが大きくなり。処理が分散することで、かえって可読性が落ちる。
オブジェクト指向というか、カプセル化はきっちりした方がいいですよ。一人で書く場合も重要。書いているうちに共通部分が次第に見出せてくるので、そういうものをクラスに分離。そうして
アクセサ介さずにデータまでpublicとして見せるのはオブジェクトのユーザが、オブジェクトの具体的なデータ構造まで意識したい場合くらいですね。
逆だよ。アクセサを使うときは、オブジェクトの具体的なデータ構造まで意識したい場合。
例えば、符号無しの多倍長整数を扱うクラスを作るとしよう。メンバ変数は、何らかの形で表現されたunsigned intの配列と、必要ならその配列の長さを保持するint型の変数としよう。そのとき、アクセサは必要?
表示のためには、文字列を返すメソッドを作ればいい。四則演算はそのためのメソッドを作ればいい。それ以外の演算に関しては結果を浮動小数点型で返すことが多いので、浮動小数点型の数値に変換するメソッドが必要。比較のためのメソッドも作る。
そういう風に考えていくと、publicのアクセサを作る必要はない。奇数や偶数であることをチェックしたいときは、最下位のunsigned intの最下位ビットをチェックするのが効率的なので、そういうメソッドを用意しておかない場合は、効率の面で辛い。でも、その場合でも、メンバ変数か、アクセサをprotectedにしておけば、継承を使い、拡張したクラスを作ることができるので、効率もカプセル化も損なわない。
符号無しの多倍長整数を扱うクラスを作るとしよう。メンバ変数は、何らかの形で表現されたunsigned intの配列と、必要ならその配列の長さを保持するint型の変数としよう。そのとき、アクセサは必要?
そういう「アクセサが不要」なクラス設計で「アクセサが不要」と言われても、「一般論としてアクセサは不要」とは言えないでしょう。
たとえば、アクセサと隠蔽の例によく挙げられるものとして複素数クラスがありますが、複素数クラスで、その実部と虚部にアクセスするアクセサは不要なものですか?
こういうクラスでデータをpublicで見せるのは、デカルト座標形式な内部表現限定な「具体的なデータ構造まで意識したいデータ構造」だし、これをpublicとして見せずにアクセサとして用意しておけば、たとえば「内部表現が極形式の複素数クラス」でも複素数クラスとしては気にせずに同じように使うことができます。
そういう「直接データを持っているとは限らないし、持ってないとも限らない」ような「オブジェクトの状態」情報へのアクセス手段の提供こそがアクセサの出番でしょう。
複素数クラスで、その実部と虚部にアクセスするアクセサは不要なものですか?
はい。不要です。「アクセサ」の定義次第ではありますが。
例えば、一般的なクラスにおいて、isZero()やisEmpty()がアクセサであるというのであれば、アクセサが不要などと言うことは言いません。そういうものは積極的に書くべきです。そういうものがないと、C++では、"obj == 0"と言うコードがあった時に泣けます。
複素数クラスで、メンバ変数が不可変ではないのに、setReal()がなくて、getReal()だけでもアクセサと言うのであれば、アクセサが不要などと言うことは言いません。
でも
この段落以降や#1886499 [srad.jp]あたりをよむと、アクセサの公開ではオブジェクトの具体的なデータ構造は(メンバ変数の公開ほどは)意識させない。メンバ変数の公開はオブジェクトの具体的なデータ構造まで意識してでも効率的に動かしたい場合に使う、という使い分けしてるように読めるんだが。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
再利用しなけりゃオブジェクト指向は不要 (スコア:1)
私感だけど、
オブジェクト指向というのは、再利用するライブラリを作成する場合は威力を発揮するのはよく分かる。
しかし、再利用しない場合は不要だし、多人数で開発する場合は他人とのインタフェース部分だけオブジェクト指向的にすれば十分だと思う。
他人に見せない内部まで生真面目にオブジェクト指向で作ったら、むしろコードサイズが大きくなり。処理が分散することで、かえって可読性が落ちる。
Re: (スコア:0)
発揮しません。再利用性で重要なのは、汎用性のある仕様です。オブジェクト指向で作ろうが、使えないものは使いたくありません。
オブジェクト指向というか、カプセル化はきっちりした方がいいですよ。一人で書く場合も重要。書いているうちに共通部分が次第に見出せてくるので、そういうものをクラスに分離。そうして
Re: (スコア:0)
カプセル化という意味では、クラスが持っているデータを直接触らせないというのは非常に重要です。
例えばgetHoge()というアクセサを用意した場合、hogeがどうやって得られるかをオブジェクトのユーザに意識させずに済むわけです。インスタンス変数かもしれないし、定数かもしれないし、別モジュールへ問い合わせた結果かもしれないし、何らかの計算結果かもしれないけど、とりあえずgetHoge()すればhogeが得られる。
さらに重要なのは、何らかの理由でクラスの仕様を変える必要が発生して、例えばいままでクラス変数として保持していたのを別のモジュールへの問い合わせに変更したとしても、getHoge()の仕様さえ変わらなければオブジェクトのユーザのコードは変える必要がないということですね。
アクセサ介さずにデータまでpublicとして見せるのはオブジェクトのユーザが、オブジェクトの具体的なデータ構造まで意識したい場合くらいですね。
Re:再利用しなけりゃオブジェクト指向は不要 (スコア:0)
逆だよ。アクセサを使うときは、オブジェクトの具体的なデータ構造まで意識したい場合。
例えば、符号無しの多倍長整数を扱うクラスを作るとしよう。メンバ変数は、何らかの形で表現されたunsigned intの配列と、必要ならその配列の長さを保持するint型の変数としよう。そのとき、アクセサは必要?
表示のためには、文字列を返すメソッドを作ればいい。四則演算はそのためのメソッドを作ればいい。それ以外の演算に関しては結果を浮動小数点型で返すことが多いので、浮動小数点型の数値に変換するメソッドが必要。比較のためのメソッドも作る。
そういう風に考えていくと、publicのアクセサを作る必要はない。奇数や偶数であることをチェックしたいときは、最下位のunsigned intの最下位ビットをチェックするのが効率的なので、そういうメソッドを用意しておかない場合は、効率の面で辛い。でも、その場合でも、メンバ変数か、アクセサをprotectedにしておけば、継承を使い、拡張したクラスを作ることができるので、効率もカプセル化も損なわない。
Re:再利用しなけりゃオブジェクト指向は不要 (スコア:1)
そういう「アクセサが不要」なクラス設計で「アクセサが不要」と言われても、「一般論としてアクセサは不要」とは言えないでしょう。
たとえば、アクセサと隠蔽の例によく挙げられるものとして複素数クラスがありますが、
複素数クラスで、その実部と虚部にアクセスするアクセサは不要なものですか?
こういうクラスでデータをpublicで見せるのは、デカルト座標形式な内部表現限定な「具体的なデータ構造まで意識したいデータ構造」だし、
これをpublicとして見せずにアクセサとして用意しておけば、たとえば「内部表現が極形式の複素数クラス」でも複素数クラスとしては気にせずに同じように使うことができます。
そういう「直接データを持っているとは限らないし、持ってないとも限らない」ような「オブジェクトの状態」情報へのアクセス手段の提供こそがアクセサの出番でしょう。
Re: (スコア:0)
はい。不要です。「アクセサ」の定義次第ではありますが。
例えば、一般的なクラスにおいて、isZero()やisEmpty()がアクセサであるというのであれば、アクセサが不要などと言うことは言いません。そういうものは積極的に書くべきです。そういうものがないと、C++では、"obj == 0"と言うコードがあった時に泣けます。
複素数クラスで、メンバ変数が不可変ではないのに、setReal()がなくて、getReal()だけでもアクセサと言うのであれば、アクセサが不要などと言うことは言いません。
でも
Re: (スコア:0)
この段落以降や#1886499 [srad.jp]あたりをよむと、アクセサの公開ではオブジェクトの具体的なデータ構造は(メンバ変数の公開ほどは)意識させない。メンバ変数の公開はオブジェクトの具体的なデータ構造まで意識してでも効率的に動かしたい場合に使う、という使い分けしてるように読めるんだが。