今回の小レポートの採点に際し、減点にした基準を説明します。
レポートの作成要領に従っていない場合は減点です。
よく見られた誤りは以下のとおりです。
次のように producePrice: を定義しても動作しますが、今回の課題では継承の機能が十分に活用できなくなります。
Goods クラスメソッド producePrice: p ^ Goods new setPrice: p |
Goods クラスのサブクラスである IceCream や IceCase は、クラスメソッド producePrice: を使うことができますが、上記の定義では、たとえば、IceCream producePrice: 100 と実行すると Goods のインスタンスが作られてしまいます。そのため、producePrice: が再利用できなくなり、次のようなコードを書くことになってしまいます。
AtariIceCream クラスメソッド producePrice: p Taste: t ^ AtariIceCream new setPrice: p setTaste: t |
アイスクリームの種類が増えるたびに、同じようなコードを書くのは面倒ですよね。
上記 1.1 の続きですが、Goods のクラスメソッド producePrice: の定義にて、new のレシーバとして Goods ではなく、self を使うことにします。すると、Workspace 上で実行してみると良いのですが、たとえば、x := IceCream producePrice: 100 とすることで、アイスクリームのインスタンスを作ると同時に値段を 100 とすることができます。
つまり、producePrice:Taste: の定義として以下のようにする必要はありません。
IceCream クラスメソッド producePrice: p Taste: t ^ self new setPrice: p setTaste: t |
どうすべきかというと、「^ (self producePrice: p) setTaste: t」とするのです。
IceCase については、self producePrice: を実行すると循環してしまう(再帰呼出し)ので、インスタンスを作り、値段を代入する部分は、上位クラスのメソッドに頼ることにします。つまり、super producePrice: を実行します。その結果に対して、iceCreams の初期値を与えることにします。まとめると、「^ (super producePrice: p) setIceCreams: Bag new」とします。なお、setIceCreams についての仕様はこの課題では指定しておらず、必要に応じて新たに追加するメソッドです。
実行1と実行3では、24個のアイスクリームを箱詰めします。Workspace 上で次のように実行すると、確かに howManyIceCreams の結果は 24 となりますが、意味が違います。
Workspace上にて c1 := IceCase producePrice: 40. g := HazureIceCream producePrice: 60 Taste: 'バニラ'. i := 1. [ i <= 24 ] whileTrue: [ c1 add: g. i := i + 1 ] |
図1. 悪い例 |
図2. 良い例 |
図2のようにするためには、c1 に add: をするたびに、アイスクリームのインスタンスを生成しなければなりません。
実行3のヒントに「なお、変数には、オブジェクトを代入することができるので、プログラムは思ったより簡単になるだろう。」とありましたが、上記のように「g := HazureIceCream producePrice: 60 Taste: 'バニラ'」としてはいけないのであれば、何だったのだろうと思うかもしれません。
思い出して欲しいのですが、オブジェクトは、インスタンスのことだけでなく、クラスもオブジェクトです。つまり、変数には「クラスを代入すること」ができます。そして、その変数にメッセージを送ることができます。
ice := HazureIceCream. ice producePrice: 60 Taste: 'ソーダ' |
ということは、8 の倍数のときに、「AtariIceCream」を生成するには、次のようにすれば良いことになります。
ice := HazureIceCream. ( i \\ 8) ifTrue: [ ice := AtariIceCream ]. ice producePrice: 60 Taste: 'ソーダ' |
感想で主なものは、次の通りでした:
これらに対する回答をします。
まず、1件目についてですが、宿題は確かに難しめのものにしています。大学では、授業だけでなく帰宅してからも勉強です。冷たく言ってしまうと、そんなものです。この演習で使うプログラミング環境は、必携パソコンでも動作しますので、帰宅してからもがんばってください。
次に 2件目についてですが、個人差が大きいので、プリントを読めば分かる人から、マンツーマンで説明しても分からない人までいます。一般に、新しいプログラミング言語を学ぶときは、書籍から入ります。まずは、プリントを読んで考えてみてください。ですが、すぐには分からないと思います。なので、授業中はもちろんオフィスアワーや通常の時間帯にも、もっと質問して下さい。よく出る質問に対しては、全員に伝えたり、こうして、Web ページに書いたりしますが、基本的に「尋ねた人の勝ち」だと思っています。ちなみに、就職の面接で重視されるのは、コミュニケーション能力です。「沈黙は金」ではありません。効率良く質問する術を体得しておいて下さい。
3件目にて、プログラミング2とかけ離れているという指摘がありましたが、今回のレポートは、プログラミング2の説明にあった範囲の知識で解答できます。抽象メソッド、クラスメソッドの作り方は説明がありました。クラスの継承の関係が複雑に見えたのかもしれませんが、この程度は、かけ離れているとはいいません。かけ離れているとは、「実行3のヒント」の部分が必須課題として回答できることを要求するような場合です。
感想文について、自分の名前のあるレポートとくっつけて提出することに、抵抗感があったかもしれません。もし、匿名で意見が言いたいならば、宿題を後から前へと回して提出する際に、一番下に差し込んで提出してください。Web を使って回答します。
最後に、難易度の調整は難しいところがありますが、感想・意見をできるだけ取り入れていきたいと思います。積極的な意思表示をお願いします。