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

ゆとりーなの日記

日記的な事を書いて行くと思はれる

大学のC++講義ってどんな感じになってるんだ?

私が友人の友人の友人?がC++の講義をとったとかで、課題のプログラムが良く分からないと聞いて、Cプラーの私は嬉々として課題のために書かれたというソースコードを見たわけです。
クラスを使ってなんか作れという課題だったようで、クラスについて取り敢えず気になった部分を愚痴愚痴と。

書き方的なサムシング

// main.cpp
class hoge {
  int x_;
  int y_;
  int z_;
  ...
 public:
  hoge() {x_ = 0; y_ = 0; z_ = 0;}
  ...
};

publicがprivateの後に書かれているという点ですが、まぁそこまで気にしなくてもいいですかね。やっぱりクラス宣言で見たいのは第一にpublic節であることが殆どですからpublic、private順に書いてほしいというのはありますが、講義じゃこんなことはまず扱わないでしょう。そしてメンバ変数の初期化の部分。コンストラクタで代入初期化してますが、まぁ組み込み型なので初期化子と比べて効率は変わりませんが、多分この辺りの事も触れてないんでしょうね。初期化子の存在すら扱ってるか怪しそうです。
で、許容できないのが変数名。a、b、cとか何に使う変数なのか訳分からんので絶対にやめてください。今回はソースコード内に散らばったコメントを見て、大体何に使うのかを把握できましたが、いつも出来るとは限りません。最低限変数名には何に使われているのか分かりやすい名前を付けるように位は講義で徹底してもらいたいものです。

クラス構成的なサムシング

作りたいものが、商品管理システム的なものだったらしく、次の様なメソッドがありました。

void hoge::buy_a() {
  x_ += 1;
  y_ += 2;
  z_ += 3;
}

void hoge::buy_b() {
  x_ += 3;
  y_ += 2;
  z_ += 1;
}

void hoge::buy_c() {
  x_ += 1;
  y_ += 3;
  z_ += 2;
}

void hoge::report(int x, int y, int z) {
  x_ = x;
  y_ = y;
  z_ = z;
  cout << "購入した商品は" << endl;
  cout << "商品X:" << x_ << "個" << endl;
  cout << "商品Y:" << y_ << "個" << endl;
  cout << "商品Y:" << z_ << "個" << endl;
}

え〜と、どうやらA、B、Cと三つの商品詰め合わせパックがあるらしく、その中にはそれぞれX、Y、Zの商品がある比率で入っている様です。まず意味不明なのがreportで商品数を引数で受け取っている部分です。カプセル化の意味が殆どない気がします。というか全くありません。折角クラスにして内部に購入商品情報を隠蔽しようとしている空気は出ているのに、外から受け取っていてはなんのためのクラスか分かりません。そもそもこれではbuy_a等で購入商品情報を書き換えても、reportで全く意味のなかったことになります。しかも購入商品数を取得するメソッドがなく、外からどういう風に購入商品情報を渡せるのかも分かりません。一体どういうクラスの教え方をしていたんですかね。書き方文法位しか教えてなかった説すら出てきます。
あと、個人的な考えとしては、クラスメソッド内で購入商品情報を出力するのはあまり好ましくない気がします。というのも表示方法を変えたい時にメソッド自体を書き換える必要がありますし、もしかするとこのメソッドを使っている別の場面では変えたくないといった時に面倒なことになります。ここは購入商品数を取得できるアクセッサを定義して、それ経由で外部で購入商品情報を出力するのがより適切だと思います。
この講義、潜ってみたかったです。