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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

408閲覧

getterの役割について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/06/13 08:15

あるクラスのフィールドにgetterでアクセスしたところでgetterの役割はただアクセスするだけにとどめておくべきなのか表示の方法まで指定していいのかが気になりました。

java

1public class ClassA { 2 int age; 3 4 public ClassA(int age) { 5 this.age = age; 6 } 7 8 public int getAge() { 9 System.out.println(this.age + "歳です"); 10 return this.age; 11 } 12} 13 14public class Main { 15 public static void main(String[] args) { 16 ClassA a = new ClassA(5); 17 a.getAge(); 18 } 19}

a.getAge();を実行して「5歳です」と表示させたい場合にgetterであるgetAge()のなかに上記のような表示方法を書いていいのでしょうか?それともgetterはアクセスするだけにとどめておいて他の箇所に表示方法を書くべきでしょうか?

もし、他の箇所に書く場合はどういう書き方が望ましいかの具体例も知りたいです。アドバイスをよろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

一つのメソッドにつき、一つの役割があるのが原則です。
あなたの作ったもともとのgetterは、「出力し、値を返す」関数になっているので、その原則に反しているように感じられます。
getterという名前を付ける以上は、値を返すことだけを実装すべきだと思います。

出力については、二通りの方法があります。

  • 呼び出す側(main)が、getterから受け取った値を出力する方法
  • Ageを出力するメソッドを、ClassAに追加する方法

例えば後者を採用すると、次のようになります。

Java

1public class ClassA { 2 int age; 3 4 public ClassA(int age) { 5 this.age = age; 6 } 7 8 public int getAge() { 9 return this.age; 10 } 11 12 public void printAge() { 13 System.out.println(this.getAge() + "歳です"); 14 } 15} 16 17public class Main { 18 public static void main(String[] args) { 19 ClassA a = new ClassA(5); 20 a.getAge(); 21 a.printAge(); 22 } 23}

冗長に思えるかもしれませんが、この方が保守性は高くなります。

投稿2017/06/13 08:22

LouiS0616

総合スコア35658

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

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

退会済みユーザー

退会済みユーザー

2017/06/13 10:22

>一つのメソッドにつき、一つの役割があるのが原則です momon-gaさんの指摘にもされました。肝に銘じておきます。 printAgeメソッドを作るんですね。役割ごとにメソッド作る練習をしまてみす。
guest

0

ひとつのメソッドでは、ひとつのことをするようにした方が良いです。

getAgeでは、returnするだけにして、
「5歳です」を表示するメソッドが欲しい場合は、
void printAgeを用意したほうが良いです。

とはいえ、printAgeを用意するよりも、
別のクラスからgetAgeの戻りを表示する仕組みにしておいたほうが汎用的です。

たとえば、日本語以外で「5歳です」を表示したい場合に、つどClassAを改修するのはイヤで、
値を保持するモデルと表示をする部分で役割分担します。

今回のMainの中で

Java

1 ClassA a = new ClassA(5); 2 Hoge.printAgeJp(a.getAge()); // 「5歳です」 3 Hoge.printAgeEn(a.getAge()); // 「5 years old」 4

みたいな感じです。
表示の部分は変更が入りやすいため、表示のメソッドをモデルに持つのはオススメしないです。

投稿2017/06/13 08:32

momon-ga

総合スコア4820

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

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

退会済みユーザー

退会済みユーザー

2017/06/13 10:18

こういう方法もあるんですね。勉強になります。
guest

0

ClassAというクラス名からはクラスの役割がわからないので適切なメソッド定義はできそうにないですね。

仮にClassAの役割が人間の情報だけを保持するクラスであるなら、年齢を取得するメソッドを定義するのは妥当ですが、年齢を出力する処理はクラスの役割を超えてしまいます。

また、ClassAが人間の情報だけでなく、行動まで責任を持つのであれば、年齢を取得するメソッドと表示する(自己紹介?)メソッドを持つことは妥当です。

投稿2017/06/13 08:57

yona

総合スコア18155

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

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

退会済みユーザー

退会済みユーザー

2017/06/13 10:15

どういう役割なのかクラス単位で考えて名前をつけるべきでした。次からはそこも掘り下げてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問