質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1316閲覧

【Ruby】オブジェクト指向で、もうちょいセンスのあるコードに書き換えたい

kazuki0714

総合スコア28

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/07/29 05:07

編集2019/07/29 05:14

テーマは、「フェラーリは車高を40cmリフトアップしたら速度が20%遅くなる」ということをコードにしたいです。
前提条件として「リフトダウンはリフトアップしてからじゃないとできない」ということを ferrari.rb に定義しました。(リフトアップ/ダウンはフェラーリだけしかできないので)
定義の仕方がいまいち弱いというか、これだと定義しなくても putsの中の計算式でなんとかなるくね?
と思ってしまい、なんか違うなぁと。

直したい箇所は ferrari.rbdef lift_down の「時速」と「車高」を def lift_up で計算された数値から計算されるようなコードにしたいのですがどうすればいいでしょうか?

lift_upで計算した数値を基準に元に戻そうと#{car.lift_up.speed /0.8}km とかにしたらエラーが出るし、どうすればいいか悩んでいまして、アドバイスお願いいたします。

Ruby

1# main.rb 2require_relative 'car' 3require_relative 'ferrari' 4require_relative 'honda' 5require_relative 'nissan' 6 7honda = Honda.new 8honda.output_information(honda) 9 10nissan = Nissan.new 11nissan.output_information(nissan) 12 13ferrari = Ferrari.new 14ferrari.output_information(ferrari) 15 16ferrari.lift_up(ferrari) 17ferrari.lift_down(ferrari)

Ruby

1#car.rb (parent class) 2class Car 3 attr_accessor :type, :capasity, :price, :speed, :height 4 5 def equipment 6 %w[アクセル ブレーキ] 7 end 8 9 def output_information(car) 10 puts '---------------------------------' 11 puts "車種: #{car.type}" 12 puts "定員: #{car.capasity}" 13 puts "価格: #{car.price}円" 14 puts "時速: #{car.speed}km" 15 puts "車高: #{car.height}cm" 16 puts "装備: #{car.equipment.join(', ')}" 17 end 18end

Ruby

1# ferrari.rb 2class Ferrari < Car 3 def initialize 4 @type = 'フェラーリ' 5 @capasity = 2 6 @price = 2_000_000_0 7 @speed = 100 8 @height = 100 9 end 10 11 def lift_up(car) 12 @is_lift = true 13 puts '----フェラーリ(リフトアップ)----' 14 puts "車種: #{car.type}" 15 puts "定員: #{car.capasity}" 16 puts "価格: #{car.price}円" 17 puts "時速: #{car.speed* 0.8}km" 18 puts "車高: #{car.height+ 40}cm" 19 puts "装備: #{car.equipment.join(', ')}" 20 end 21 22 def lift_down(car) 23 return unless @is_lift 24 @is_lift = false 25 puts '----フェラーリ(リフトダウン)----' 26 puts "車種: #{car.type}" 27 puts "定員: #{car.capasity}" 28 puts "価格: #{car.price}円" 29 puts "時速: #{(car.speed* 0.8)/ 0.8}km" #ここをリフトアップした数値を基準に元の数値に戻したい 30 puts "車高: #{(car.height+ 40) - 40}cm" #ここをリフトアップした数値を基準に元の数値に戻したい 31 puts "装備: #{car.equipment.join(', ')}" 32 end 33end

Ruby

1# honda.rb 2class Honda < Car 3 def initialize 4 @type = 'ホンダ' 5 @capasity = 8 6 @price = 100_000_0 7 @speed = 10 8 @height = 100 9 end 10end

Ruby

1# nissan.rb 2class Nissan < Car 3 def initialize 4 @type = 'ニッサン' 5 @capasity = 5 6 @price = 50_000_0 7 @speed = 10 8 @height = 100 9 end 10end

下記は出力した時のスクショです。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ruby

1#car.rb (parent class) 2class Car 3 # capasity -> capacity 4 attr_accessor :type, :capacity, :price, :speed, :height 5 6 def equipment 7 %w[アクセル ブレーキ] 8 end 9 10 def output_information 11 puts '---------------------------------' 12 puts "車種: #{type}" 13 puts "定員: #{capacity}" 14 puts "価格: #{price}円" 15 puts "時速: #{speed}km" 16 puts "車高: #{height}cm" 17 puts "装備: #{equipment.join(', ')}" 18 end 19 20 def initialize(type: '(車種)', capacity: 1, price: 0, speed: 10, height: 100) 21 @type = type 22 @capacity = capacity 23 @price = price 24 @speed = speed 25 @height = height 26 end 27end 28 29 30# ferrari.rb 31class Ferrari < Car 32 def initialize 33 # 親(Car)のinitializeを呼び出す 34 # 親クラスのインスタンス変数を直接操作するのは、親クラスの仕様変更に弱い 35 super( 36 type: 'フェラーリ', capacity: 2, 37 price: 2_000_000_0, speed: 100 38 ) 39 output_information 40 end 41 42 def lift_up 43 @is_lift = true 44 # selfの状態を変更し 45 self.type = 'フェラーリ(リフトアップ)' 46 self.speed *= 0.8 47 self.height += 40 48 # 出力は親クラスのメソッドに任せる 49 output_information 50 end 51 52 def lift_down 53 # 何もせずreturnするだけよりは、呼び出し元に対して例外を返した方が親切 54 raise "リフトアップしていない車はリフトダウンできません" unless @is_lift 55 @is_lift = false 56 self.type = 'フェラーリ(リフトダウン)' 57 self.speed /= 0.8 58 self.height -= 40 59 output_information 60 end 61end 62 63ferrari = Ferrari.new 64ferrari.output_information 65ferrari.lift_up 66ferrari.lift_down

全体的に、carを引数に取る必要はなく(必要ならば)selfを使います。

投稿2019/07/29 12:26

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuki0714

2019/07/30 00:51

ありがとうございます! めっちゃ分かりやすいです! 早速参考にさせていただきます!
asm

2019/07/31 02:15

あとは、lift_up lift_downが2つの事(selfの状態変化・状態表示)を行っている事が気になっています。 「単一責任の原則」のような、ちょっと違うような微妙な感じなのですが 果たして、lift_upというメソッド名から表示まで行うことを推測できるかというと微妙ですし 変更・表示が1つのメソッドというのは違和感あります。 (かといって、分けるとmain側がごちゃっとするので今回は見逃しておきます)
kazuki0714

2019/07/31 02:23

output_informationを違うメソッドで定義するほうがいいということでしょうか? (例えば `lift_up_output` のようなメソッドで)
asm

2019/07/31 02:35

lift_upは変更のみで、表示したいのならば各々output_informationを実行する感じですね ただ、記述量が単純に倍になってめんどくさいですし 変更を実行し、結果を表示するための整備工場的なクラスを間に挟んで 利用者はそこに車を持ち込んで注文する・・・てのが個人的にはスッキリするかな と思います。 自分だけしか開発に関わってなく利用者も自分だけという小規模ならば、あえて無視する程度の問題です
kazuki0714

2019/07/31 02:43

なるほどですね、ありがとうございます! 勉強用に自分1人で書いてたのでそこまで意識が回ってませんでした(>_<)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問