質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

3回答

274閲覧

オブジェクト指向の「原則」?の解釈

BeatStar

総合スコア4958

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

3クリップ

投稿2017/08/03 03:55

趣味でプログラミングをしています。

ちょっと解釈に困っていることがあります。

オブジェクト指向を取り入れている言語の場合、

「メソッド(メンバ関数)はフィールド(メンバ変数)にアクセスしなければならない」と言われますよね。

これ自体はいいですが、複数メンバ変数(フィールド) があった場合はどうなのでしょうか?

■ メソッドは 必ず「すべての」フィールドにアクセスしなければならない

■ メソッドは 必ず「少なくとも一つの」フィールドにアクセスしなければならない

の2通りの解釈ができますね。

例えば ファイルを読み書きするクラスを C/C++ で組むとします。 ( FILEポインタを介する方 )

コンストラクタで ファイル名 を受け取ります。
オプションとして (= デフォルト引数 ) で ファイルモード ( テキストか バイナリか ) を受け取るとします。

UML風に書くと、

+ CONSTRUCTOR(...) + DESTRUCTOR() + open(void) : bool + 処理1(...) : bool ... - filename : std::string - mode : int // バイナリモードかテキストモードか - fp : FILE*

みたいになりますよね。

openメソッドで すでに filename と mode でファイルを開いているので
処理1メソッド ( writeとか readとか ) は filename と mode は使いませんよね。
使うのは fp のみ。

もし「すべての」と解釈すると「違反」かなと。

どう解釈すればいいのでしょうか?

「自分で組んでみろ」と言われても...
( コンパイルは通るが、「原則」とか「命名規則」とかはコンパイラがはじかないし... )

[情報]
使える言語: C, C++, Java

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

「メソッド(メンバ関数)はフィールド(メンバ変数)にアクセスしなければならない」

う~ん、間違ってはいないのですが、ニュアンスに強い違和感を感じます。
「本質的にメンバ変数にアクセスしないものをメンバ関数として設計すると無用な依存性を生むのでやめましょう」と言う意味です。
本質的にはメンバ変数にアクセスするけど、現時点では「たまたま」必要ないのでアクセスしていないようなケースでは、メンバ関数として定義した方が好ましいと思います。

メソッドは 必ず「すべての」フィールドにアクセスしなければならない

目的を見失っています。このようなルールは200%間違いです。

メソッドは 必ず「少なくとも一つの」フィールドにアクセスしなければならない

こちらは方針としては理解できます。1つもメンバ変数にアクセスしていないメンバ関数は、static関数、もしくは、フリー関数として設計することを検討するのは好ましいと思います。

投稿2017/08/03 04:18

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「メソッド(メンバ関数)はフィールド(メンバ変数)にアクセスしなければならない」と言われますよね。

この前提自体、環境に依る部分が多いかなと思います。

Rubyでは、インスタンスと無関係なprivateインスタンスメソッドも普通に使われます。

投稿2017/08/03 04:03

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「メソッドはフィールドのみにアクセスしなければならない」ならば意味が通ります。
(ま、厳密にはメソッドパラメータも当然アクセスするわけですが)

でなければカプセル化ができていないことになりますから。

投稿2017/08/03 05:04

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2017/08/03 05:52

ということは、メソッドは分割してはいけないのでしょうか? 例えば C言語のようなオブジェクト指向を取り入れていない言語の場合、「あ、ここは関数化した方がいいな。」とか。 それはダメなのでしょうか?
tacsheaven

2017/08/03 05:57

そういう意味ではありません。メソッドが取り扱う事柄は、外部からの入力であるパラメータを除けば、クラス内部に限定されるべき、だからです。 最終出力として出すものを除けば、クラス内で完結していなければならないのです。 なので、クラスのメソッドが、別の(自分自身のクラスの)メソッドを呼び出すのは当然ありです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問