R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

オブジェクト指向におけるFizzBuzz問題を解いてみたよ

オブジェクト指向におけるFizzBuzz問題
http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx
(東方算程譚 より)


【問題】
class Program {
  public static void Main() {
    Animal animal;
    animal = new Dog();
    animal.Sound();
    animal.SetCount(3);
    animal.Sound();
    animal = new Cat();
    animal.Sound();
  }
}
上記のプログラムを実行した結果が
わん
わんわんわん
にゃー
となるように Animal, Cat, Dog を実装しなさい。


解いてみました


abstract class Animal {
  private int count;
  private string soundText;
  public Animal(string soundText) {
    this.count = 1;
    this.soundText = soundText;
  }
  public void SetCount(int value) { this.count = value; }
  public void Sound() {
    for(var i = 0; i < this.count; ++i) Console.Write(this.soundText);
    Console.Write("\r\n");
  }
}
class Dog : Animal { public Dog() : base("わん") {} }
class Cat : Animal { public Cat() : base("にゃー") {} }
class Pig : Animal { public Pig() : base("ぶー") {} }


何も考えず素直に書いたコードなんですけど・・・^^;

以下、見苦しい言い訳です^^;

オブジェクト指向プログラミングにおいても、どんなソフトウェアを作るのかによって、そのオブジェクトに欲せられる振る舞いが変わる気がします。

問題のソフトウェアの要件はわかりませんが、少なくとも各種動物の鳴き声を指定回数分だけ1行に表示するために動物というクラスが、ソフトウェア内部に用意されたのでしょう。

ですから、このクラスにとって鳴き声は重要ですからコンストラクタで定義すべきだと思いました。
鳴き声の無い動物が将来的に追加されることもあるかもしれませんが、先に述べた理由によって、明示的に String.Empty を与えるべきだと思います。

これによって、Main 側で鳴き声を定義する前に Sound() メソッドが実行されることはありません。

以上、言い訳でした。

#ぶーは余計でしたね。
#さらに、ひろえむさんのご指摘で abstract を追加しますた。動物は抽象的なものですからね。

投稿日時 : 2007年11月9日 9:55

Feedback

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 10:13 ひろえむ

これはさすがにダメじゃないかな?(^^;

これだと
Animal 謎の動物 = new Aminal("なんだこれ?");
ができるのはいただけないのではないかと。

「動物」という動物はいないはずですよ。

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 10:19 επιστημη

> 先に述べた理由によって、明示的に String.Empty を与えるべきだと思います。

んー...そぉなのかな?

"空の鳴き声を持つ"んじゃなく
"鳴き声を持たない"んじゃないかと。

だからあたしゃ
protected abstract string soundText { get; }
であるべきと考えますが、いかが?

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 10:24 R・田中一郎

ひろえむ さん

>Animal 謎の動物 = new Aminal("なんだこれ?");

あ、確かにそうですね。
Aminalは、抽象的な存在にしておきたいですよね。

----------------------------------
επιστημη さん

>"空の鳴き声を持つ"んじゃなく
>"鳴き声を持たない"んじゃないかと。

うーん、そしたら Sound をインターフェイスのメンバにすることを検討したくなってきます。

----------------------------------
こういうやり取り楽しい・・・
やっぱりオブジェクト指向は面白いなぁ。

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 10:35 επιστημη

> そしたら Sound をインターフェイスのメンバにすることを検討したくなってきます。

なのよねー。

interface Soundable {
void SetCount(int n);
void Sound();
}

abstract class Animal;
abstract class SoundAnimal : Animal, Soundable;
class Dog : SoundAnimal;
...

なんてなハイアラキにしたいとこですが、
FizzBuzzが目的なのでそこまで凝っちゃイカンだろぉと。

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 11:32 刈歩 菜良

抽象メソッドがない抽象クラスってのに違和感を感じるのはわたくしだけ?

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 11:36 R・田中一郎

そうなんですよー

最初に浮かんだのが、以下のような使われ方はされないだろうか?、ってところでした。

Animal[] animals = { ぽち, たま, ハチ公, うさちゃん }
foreach(var x in animals} x.Sound();

で、うさちゃんは鳴かないから例外エラーかな?、となった訳です。
この解決策として、インターフェイスを使ってしまうので^^;

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 11:37 R・田中一郎

や、実は僕もです>かるぼさん

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 11:47 R・田中一郎

うーん、やっぱり soundText を抽象化すべきなのかなー
うさちゃんを含めること自体がバグですもんね。

うーんうーん。


# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 11:51 επιστημη

C++屋的にはあり得ないんだよなー > 抽象メソッドがない抽象クラス
抽象メソッドの存在=抽象クラスなもんだから。

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 12:04 Gushwell

動物っていう動物が現実世界にはいないけど、ソフトウェアの世界では有りだと思っているので、このような実装の場合、Animalのコンストラクタに鳴き声入れて、すべて、Animalのインスタンスで動かすってのはダメ?
でも、元のお題の要件満たさないか orz...

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 13:35 R・田中一郎

επιστημη さん

やっぱりそうですよね orz

--------------------------
Gushwell さん

>このような実装の場合、Animalのコンストラクタに鳴き声入れて、すべて、Animalのインスタンスで動かすってのはダメ?

そうなんですよね。
僕も、それが手っ取り早いなぁ、なんて思ったんですけど、確かに、ひろえむさんの最初のコメントのように

Animal 謎の動物 = new Aminal("なんだこれ?");

が作れてしまうので、これは避けたいんですよね。

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 14:58 渋木宏明(ひどり)

誰も書いてないトコをば。

>Console.Write("\r\n");

Console.WriteLine();

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 15:02 R・田中一郎

ふかーく「なるほどー」と頷いてしまいました^^;

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 15:04 R・田中一郎

今日の僕は、何て即レスな奴なんだ!

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 20:21 とっちゃん

今頃コメントw

おいらの実装は、きっちりと、new Animal( ... );をNGにしてますよーw

ひねくれ者だといわれたけどwww

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/09 20:22 Gushwell

やはりダメですか。
となると、
protected abstract string soundText { get; }
ですかね。

# re: オブジェクト指向におけるFizzBuzz問題を解いてみたよ 2007/11/10 9:51 R・田中一郎

とっちゃん

>ひねくれ者だといわれたけどwww

インターフェイスを使わないなら、protected なコンストラクタで良いと思うんですけどねー

----------------------------------
Gushwell さん

>となると、
>protected abstract string soundText { get; }
>ですかね。

そうですね。
やっぱり、これが模範解答になるんでしょうね。

OOP って深いなー^^;

# It's going to be end of mine day, however before ending I am reading this enormous paragraph to increase my know-how. 2019/11/24 1:24 It's going to be end of mine day, however before e

It's going to be end of mine day, however before ending I am reading this enormous paragraph
to increase my know-how.

# It's going to be end of mine day, however before ending I am reading this enormous paragraph to increase my know-how. 2019/11/24 1:25 It's going to be end of mine day, however before e

It's going to be end of mine day, however before ending I am reading this enormous paragraph
to increase my know-how.

# It's going to be end of mine day, however before ending I am reading this enormous paragraph to increase my know-how. 2019/11/24 1:26 It's going to be end of mine day, however before e

It's going to be end of mine day, however before ending I am reading this enormous paragraph
to increase my know-how.

# It's going to be end of mine day, however before ending I am reading this enormous paragraph to increase my know-how. 2019/11/24 1:27 It's going to be end of mine day, however before e

It's going to be end of mine day, however before ending I am reading this enormous paragraph
to increase my know-how.

# Hello to every single one, it's genuinely a pleasant for me to pay a quick visit this site, it contains precious Information. 2020/01/07 20:53 Hello to every single one, it's genuinely a pleasa

Hello to every single one, it's genuinely a pleasant for me to pay a quick visit this site, it contains precious Information.

タイトル  
名前  
Url
コメント