開発環境
- OS X Lion - Apple(OS)
- TextWrangler(Text Editor) (BBEditの機能制限無料版、light版)
- Script言語:Ruby
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 13章(新しいクラスの作成と既存クラスの変更), 13.6(練習問題の続き)オレンジの木 を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
オレンジの木
コード(TextWrangler)
sample.rb
#!/usr/bin/env ruby1.9 # -*- coding: utf-8 -*- class OrangeTree def initialize @height = 0 @age = 0 @alive = true @orange_count = 0 end def height @height end def age @age end def one_year_passes @orange_count = 0 @age += 1 if @alive if (@age.class == Fixnum) && @age > 10 @height = nil @age = nil @alive = false end @height += 5 if @alive @orange_count = @age * 2 if @alive && @age >= 5 end def count_the_orange @orange_count end def pick_an_orange if ! @alive puts "もうオレンジの木は枯れているので実はとれません。" elsif @orange_count > 0 puts "とても美味しいオレンジが採れました!" @orange_count -= 1 elsif @age < 5 puts "もう少し成長してからではないと実は採れません。" else puts "今年はもう採れる実がありません。" end end end ot = OrangeTree.new puts "樹齢:#{ot.age} 高さ:#{ot.height} 実の数:#{ot.count_the_orange}" 11.times do ot.one_year_passes puts "樹齢:#{ot.age} 高さ:#{ot.height} 実の数:#{ot.count_the_orange}" (ot.count_the_orange + 1).times do ot.pick_an_orange end end
入出力結果(Terminal)
$ ./sample.rb 樹齢:0 高さ:0 実の数:0 樹齢:1 高さ:5 実の数:0 もう少し成長してからではないと実は採れません。 樹齢:2 高さ:10 実の数:0 もう少し成長してからではないと実は採れません。 樹齢:3 高さ:15 実の数:0 もう少し成長してからではないと実は採れません。 樹齢:4 高さ:20 実の数:0 もう少し成長してからではないと実は採れません。 樹齢:5 高さ:25 実の数:10 とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:6 高さ:30 実の数:12 とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:7 高さ:35 実の数:14 とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:8 高さ:40 実の数:16 とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:9 高さ:45 実の数:18 とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:10 高さ:50 実の数:20 とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! とても美味しいオレンジが採れました! 今年はもう採れる実がありません。 樹齢: 高さ: 実の数:0 もうオレンジの木は枯れているので実はとれません。 $
ちなみにJavaScriptの場合。
コード(TextWrangler)
<script> var OrangeTree = function(){ var height = 0; var age = 0; var alive = true; var orange_count = 0; this.height = function(){ return height; }; this.age = function(){ return age; }; this.one_year_passes = function(){ orange_count = 0; if(alive) age += 1; if(age > 10){ height = null; age = null alive = false; } if(alive){ height += 5; if(age >= 5){ orange_count = age * 2; } } }; this.count_the_orange = function(){ return orange_count; }; this.pick_an_orange = function(){ if(!alive){ return "もうオレンジの木は枯れているので実は採れません"; } else if (orange_count > 0){ orange_count -= 1; return "とても美味しいオレンジが採れました!"; } else if(age < 5){ return "もうすこし成長してからではないと実は採れません"; } else { return "今年はもう採れる実がありません。"; } }; }; var ot = new OrangeTree(); function age(){ $('#d0').append("樹齢: " + ot.age() + "<br />"); } function h(){ $('#d0').append("高さ: " + ot.height() + "<br />"); } function pick_an_orange(){ $('#d0').append(ot.pick_an_orange() + "<br />"); } function count_the_orange(){ $('#d0').append("木になっている実の数: " + ot.count_the_orange() + "<br />"); } </script> <div id="d0"> </div> <input type="button" value="樹齢" onclick="age()" /> <input type="button" value="高さ" onclick="h()" /> <input type="button" value="オレンジの実を1個収穫" onclick="pick_an_orange()" /> <input type="button" value="木になっている実の数" onclick="count_the_orange()" /> <input type="button" value="一年経過させる" onclick="ot.one_year_passes()" /> <input type="button" value="新しいオレンジの木を植える" onclick="ot = new OrangeTree()" />
pythonの場合。
sample.py
コード(TextWrangler)
#!/usr/bin/env python # -*- coding: utf-8 -*- class OrangeTree: def __init__(self): self.height = 0 self.age = 0 self.alive = True self.orange_count = 0 def one_year_passes(self): self.orange_count = 0 if self.alive: self.age += 1 if (type(self.age) == type(10)) and self.age > 10: self.height = None self.age = None self.alive = False if self.alive: self.height += 5 if self.age >= 5: self.orange_count = self.age * 2 def pick_an_orange(self): if not self.alive: print("もうオレンジの木は枯れているので実は採れません。") elif self.orange_count > 0: print("とてもおいしいオレンジが採れました!") self.orange_count -= 1 elif self.age < 5: print("もう少し成長してからではないと実は採れません。") else: print("今年はもう採れる実がありません。") ot = OrangeTree() print("樹齢:{0} 高さ:{1} 実の数:{2}".format(ot.age, ot.height, ot.orange_count)) for x in range(11): ot.one_year_passes() print("樹齢:{0} 高さ:{1} 実の数:{2}".format(ot.age, ot.height, ot.orange_count)) for i in range(ot.orange_count + 1): ot.pick_an_orange()
入出力結果(Terminal)
kamimura$ ./sample.py 樹齢:0 高さ:0 実の数:0 樹齢:1 高さ:5 実の数:0 もう少し成長してからではないと実は採れません。 樹齢:2 高さ:10 実の数:0 もう少し成長してからではないと実は採れません。 樹齢:3 高さ:15 実の数:0 もう少し成長してからではないと実は採れません。 樹齢:4 高さ:20 実の数:0 もう少し成長してからではないと実は採れません。 樹齢:5 高さ:25 実の数:10 とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:6 高さ:30 実の数:12 とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:7 高さ:35 実の数:14 とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:8 高さ:40 実の数:16 とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:9 高さ:45 実の数:18 とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:10 高さ:50 実の数:20 とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! とてもおいしいオレンジが採れました! 今年はもう採れる実がありません。 樹齢:None 高さ:None 実の数:0 もうオレンジの木は枯れているので実は採れません。 $
Pythonはデータの隠蔽が出来ない。上記のrubyやjavascriptのように、同じ名前のデータ属性とメソッドを定義する と上書きされる。データ属性の先頭に下線「_」を付け加えて読みやすくするようにしたり、メソッド名は動詞にするなどして回避はできるけど、外からアクセス、変更可能 である事には変わりはない。(pythonはデータの隠蔽、カプセル化はできない。)
データ属性とメソッドに分けた場合のクラス設計。
#!/usr/bin/env python # -*- coding: utf-8 -*- class OrangeTree: def __init__(self): self._height = 0 # 変数名の先頭に下線を付ける self._age = 0 self.alive = True self.orange_count = 0 def height(self): return self._height def age(self): return self._age # メソッド名を動詞にする def count_the_orange: return self.orange_count def one_year_passes(self): self.orange_count = 0 if self.alive: self._age += 1 if (type(self._age) == type(10)) and self._age > 10: self._height = None self._age = None self.alive = False if self.alive: self._height += 5 if self._age >= 5: self.orange_count = self._age * 2 def pick_an_orange(self): if not self.alive: print("もうオレンジの木は枯れているので実は採れません。") elif self.orange_count > 0: print("とてもおいしいオレンジが採れました!") self.orange_count -= 1 elif self._age < 5: print("もう少し成長してからではないと実は採れません。") else: print("今年はもう採れる実がありません。")
0 コメント:
コメントを投稿