アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミング未経験学習中です。

タイトルにもある通り、例文で出てきたコードの内容と
私の理解が正しいものかご教授いただけないでしょうか。

非常にめんどくさいですが、
一連の流れを言語化していただけると非常に理解しやすいです。
※面倒かと思いますので、理解があっているかどうかだけ教えていただければ幸いです。


〇例文

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

class Point {
  int x;
  int y;

  void multiply(int n) {
    this.x *= n;
    this.y *= n;
  }

  boolean isSamePosition(Point p) {
    if(this.x == p.x && this.y == p.y) {
      return truel;
    } else {
      return false;
    }
  }
}

class ArgumentExample2 {
  public static void main(String[] args) {
    Point p1 = new Point();
    p1.x = 2;
    p1.y = 4;
    Point p2 = new Point();
    p2.x = 4;
    p2.y = 8;

   ①if(p1.isSamePosition(p2)) ==true) {
      System.out.prinln("p1とp2は同じ座標です");
    } else {
      System.out.prinln("p1とp2は異なる座標です");
    }

    p1.multiply(2);

   ②f(p1.isSamePosition(p2)) ==true) {
      System.out.prinln("p1とp2は同じ座標です");
    } else {
      System.out.prinln("p1とp2は異なる座標です");
    }
  }
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

〇私の考え

上記内容の以下の部分の認識となります。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
boolean isSamePosition(Point p) {
    if(this.x == p.x && this.y == p.y) {
      return truel;
    } else {
      return false;
    }
  }
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

と、下記 p1.multply(2)の前の


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
if(p1.isSamePosition(p2)) ==true) {
      System.out.prinln("p1とp2は同じ座標です");
    } else {
      System.out.prinln("p1とp2は異なる座標です");
    }
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

についてですが、


①内 isSamePosition(p2)指定があるので 
p2の値4.8を boolean 内のthis.x==p.x / this.x==p.yに代入し、
if(p1.isSamePosition(p2)) ==true)は、if(2.4=4.8) ==trueではないので
"p1とp2は異なる座標です"を表示する。ということでよろしいでしょうか。

その場合、"p1.multiply"後の同様の比較もp2に関しては同じでしょうか。
if(p1.isSamePosition(p2)) ==true)は、if(4.8=4.8) ==trueなので
"p1とp2は同じ座標です"を表示する。ということになりますか。

でもその場合、わざわざmultiplyで掛け算をしないp.2のほうをbooleanでtrueの判断をさせる必要があるのか、、(値が変わらないため)と考えてしまいます。

また、
if(p1.isSamePosition(p2)) ==true) の最後の "==true" の考え方が 
p.1とisSamePosition(p2)の値が同じであればtrueなのか 

それともp.1とp.2がbooleanでtrueとなった結果が"==true"
しかしそうなると p2はbooleanでtrue or falseの判断ができていますが
p.1はその判断をしていないため、この考え方は違っていると私は思っています。

この例文自体に対して感覚的にわざわざめんどくさくしている感じがしてしっくりこないのですが
参考書の為、「引数 戻り値のあるメソッド」 がわかりやすい例題にしているのでしょうか。


今後の参考までに
もし可能でしたら同じ内容で簡潔な方法があれば教えていただきたいです。

長々と申し訳ございませんが、ご教授願えませんでしょうか。
よろしくお願いいたします。

A 回答 (3件)

○文中「boolean」と何度も使われていますが、booleanはtrueかfalseの値を持つ型であって、「boolean内」等と使われるものではありません。



boolean isSamePosition(Point p)

・メソッド名: isSamePosition
・戻り値: boolean
・引数1: Point型. メソッド定義中での引数名(変数名)は p
という意味です。
文中で「boolean」と書いてあるほとんどは「isSamePosition」と書くべきものです。


○メソッドを使うときは
基準になるオブジェクト.メソッド名(引数1,引数2,....)
となります。このとき、
基準になるオブジェクト → メソッド内のthis
引数1→ メソッド内の引数1の名前
...
となります。
※ 基準になるオブジェクトが無い(クラスを基準にする)メソッドもありますが、割愛します。

A.isSamePosition(B) は「Aオブジェクトが所有するisSamePositionメソッドで、引数1にBを指定」です。
isSamePositionメソッド定義中の thisはA,pはBを指します。

p1.isSamePosition(p2)は「p1オブジェクトが所有するisSamePositionメソッドで、引数1にp2を指定」です。
isSamePositionメソッド定義中の thisはp1,pはp2を指します。

> if(p1.isSamePosition(p2) ==true) の最後の "==true" の考え方が 
> p1とisSamePosition(p2)の値が同じであればtrueなのか 

そもそも「p1とisSamePosition(p2)」と分割できるものではありません。
p1.isSamePosition(p2) で1セットです。
「p1.isSamePosition(p2) ==true」は「p1.isSamePosition(p2) (の結果)が true と等しかったら」という意味です。



全体では
・p1とp2を作ったよ(new と x,yへの代入)
・p1とp2は座標が違うよ(isSamePositionで確認)
・p1をmultiply(2)でx,yを2倍したよ
・p1とp2は同じ座標になったよ(isSamePositionで確認)
という、正に例題のためだけのくだらないプログラムです。



余談:
・参考書等では、if文では if(条件) ~ となっていますが、実際はif(true またはfalseに変換できる式)です。
==演算子は「両辺が等しかったらtrue,そうでなければfalseになる」という「計算」をします。(不等号も同様の「計算」をします)
if (A==B) はif((A==B)==true) と同じ意味です。
逆に、booleanを返すメソッド等では、わざわざ==true等と書く必要がありません。
if(p1.isSamePosition(p2) ==true)
は、普通は
if(p1.isSamePosition(p2))
と書きます。

・オブジェクトが「同じ」という判定をする場合、==ではできないことがあります。
その場合にはequalsメソッドを使うのが普通です。
どうゆう場合を「同じ」とするかは、クラスの設計によって異なるため、各クラスで「当該クラス向けのequalsメソッド」を再定義する必要があります。
今回の例でも、本来なら isSamePositionではなくequalsとするべきでしょう。

この再定義(override)はJavaを含めたオブジェクト指向プログラミング言語の重要な機能なので、学習初期の段階では使わないようにするために、isSamePositionという名前を使ったと思われます。
    • good
    • 0

同じ内容で簡潔な方法ならば



// 条件式や定数をインライン展開
表示( (2 == 4 && 4 == 8)? "同じ": "異なる" );
// 加減剰余もインライン展開
表示( (2*2 == 4 && 4*2 == 8)? "同じ": "異なる" );

もっとやるなら

表示( "異なる" ); // 条件が成り立たないのは明白なので
表示( "同じ" ); // 条件が成り立つのは明白なので

ただし、このように書いてしまうと、
他人が読んだときに処理内容が理解しずらい保守性の低いコードになってしまうので、少々面倒でも意味合いに即した書き方をすべきです。

p1 = ベクトル座標(2,4), p2 = ベクトル座標(4,8);
表示( p1.is同じ座標(p2)? "同じ": "異なる" ); // 英語文章っぽく読める
p1.掛け合わせる(2);
表示( p1.is同じ座標(p2)? "同じ": "異なる" );

Java は伝統的に業務処理向けなので、意味合いが読み取れるように書く傾向が、他言語と比べて強いです。めんどくさいと感じるでしょうが、保守性が低いコードが量産される悲劇を繰り返さないためにも、論理的な意味合いを意識して書いてみましょう。
    • good
    • 0

> この例文自体に対して感覚的にわざわざめんどくさくしている感じがしてしっくりこない



そういう事はしばしばあります。
と言うか、そもそも「参考書」は相当慎重に選ばないとクズを掴まされる確率は90%以上です。
もっと言うと、Javaは初心者向けじゃなく、更なる混乱に初心者を叩き込む。

> 参考書の為、「引数 戻り値のあるメソッド」 がわかりやすい例題にしているのでしょうか。

逆でしょうね。
むしろ「引数 戻り値のあるメソッド」だとすればあんま良い例じゃないんじゃないか・・・あんまJavaはよう知らんけど。

> もし可能でしたら同じ内容で簡潔な方法があれば教えていただきたいです。

Javaで好まれるスタイルかどうかは全く知らないけど、僕ならこう書くだろうな、と言う例です。
まぁ、Javaあんま知らないんで(それどころかオブジェクト指向嫌い)、あんまマトモに受け取らないでいいです。
あくまで参考まで、に。

ArgumentExample2.java:
https://www.ideone.com/P4dYPC

Point.java
https://www.ideone.com/sceeZl

関数型言語ファンだったらこう書くだろうな、って事で、Javaで望ましいスタイルかどうかは知りません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!