-
Notifications
You must be signed in to change notification settings - Fork 29
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ある一定のルールで運行している電車の時刻表を算出する機能 #5
base: master
Are you sure you want to change the base?
Conversation
station_ss3 = stations.select {|target| target[:id] == 'SS3' }.first | ||
station_ss21 = stations.select {|target| target[:id] == 'SS21' }.first | ||
assert_equal('SS1', station_ss1[:id]) | ||
assert_equal(true, station_ss3.nil?) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RSpecのcontext っぽい感じで Minitestでの正常系・異常系のかき分けがイマイチわからなかったのですが
class ExpressTrainTest < MiniTest::Unit::TestCase
def setup
end
test '急行停車する駅を抽出する場合' do
def test_stop_stations
# 省略
end
end
test '急行通過する駅を抽出する場合' do
def test_stop_stations
# 省略
end
end
end
みたいに書くのが良いのですかね?
プルリクありがとうございます!見てみます。 僕以外の方からの意見も集まるよう、現在このリポジトリを宣伝中ですので、気長にお待ちいただければと思います。 |
全然大丈夫ですよ~ 私も身の回りで、ちょっとづつこのリポジトリ宣伝してるので、ちょっとづつ興味ある人が増えていけば良いですね 😄 |
def initialize(args) | ||
@base_times = args[:base_times] | ||
@start_time = args[:start_time] | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この args には Hash を渡しているようなので、キーワード引数でいいんじゃないかなと思いました。
def initialize(base_times:, start_time:)
11行目で @start_time
をパースしているようなので、 start_time
は文字列でしょうか。 start_time
という変数名から Time クラスのインスタンスが渡ってきそうな気がしました。 参考
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
start_time は文字列でしょうか
BaseStartTime の単体テストがあればこの辺の仕様が明確になりそうです
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あ、確かに今みたら、BaseStartTime の単体テスト存在して無かったですね 😓
だから、この処理について期待される振る舞いがどうしても他の人には伝わりづらくなってましたね・・
仕事だったら、「早速修正します!」という流れになりそうですが、ちょっと今、色々あって余裕ないのでそっちの対応は保留します
hour = Time.parse(@start_time).hour | ||
hour = target.empty? ? hour + 1 : hour | ||
Time.new(2018, 1, 1, hour, minute) | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
また名前の話になってしまうのですが、 prepare
だと何をしてくれるメソッドなのか分からなかったです。戻り値は Time クラスのインスタンスのようなので、何かの時刻を取得するためのメソッドでしょうか。
format_datetime(target) | ||
end | ||
result | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この result という変数は他で特に使っていないようなので、
def timetable_list
timetable.prepare(station_list).map do |r|
target = r[:station][:id] == 'SS21' ? r[:arrive_at] : r[:start_at]
format_datetime(target)
end
end
で良さそうです
|
||
def stop_stations | ||
express_stop_names | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
これ処理を別のメソッドに抽出する必要ありますかね。もし別名を付けたいだけなのであれば alias_method
とかで良いんじゃないかなと思いました
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここの意図は電車は
- 各駅停車が停車される駅
- 急行電車が停車される駅
によって異なるために、
express_train = ExpressTrain.new
express_train.stop_stations
# => 急行停車駅の一覧が返ってくる
local_train = LocalTrain.new
local_train.stop_stations
# => 各駅停車駅の一覧が返ってくる
という形にしたかったのが理由としてあります
|
||
def start_time_minute | ||
super | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
28-30行目不要そうです。書かなくても親クラスの start_time_minute が呼ばれます
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
なるほど~
|
||
def start_time_minute | ||
super | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
同上
cc: @chooyan-eng 試しにレビューしてみましたけど、いまいちピンと来なかったです。 例えば「このメソッド名はこういう理由で良くないですよ」ってコメントしても、 |
@ttanimichi
について、お伺いしたいのですが、ピンと来ない理由として
のどれになりそうなのでしょうか? PR出してから、2ヶ月ほど何もフィードバックなかったので、レビュアーとして関わろうとした時にどういうスタンスで望めばよいのか各自考え方異なりそうで結果
というのが出てきて、結局コードレビューするのがツラいから今までの状況につながるのかなとふと感じたので。 |
1 に近いですかね。どこまで深くレビューすべきなのかなっていうのがふわっとしてて。あまり表面的なレビューだけしても価値が薄いでしょうし
FizzBuzz の PR をしてる人が多いですが、FizzBuzz のコードなんかを見ても「ふーん」とか「へえ」くらいの感想しか出てこなくてレビューできる気がしなかったので、この PR のレビューをすることにしました。 |
@ttanimichi @hoyamada このプルリク上でやりとりが続くとコードに対するコメントと混ざってしまうため、issue #10 を作りました。もしよろしければこちらで議論させていただければと思います。 |
このPRについて
こちらの仕様の処理を実装しました
実行結果
cd user/h5y1m141 ruby ./main.rb
上記実行結果は以下のように表示されます
テストについて
MiniTestは使ったことがないのでこんな書き方で良いのかどうか悩みながらも一応
の時刻表算出時のベースになりそうなメソッドに対して網羅しました。
参考
コード読む上で参考情報を記載しておきます
それぞれのクラスの役割
各駅停車の処理を例にシーケンス図まとめました。
実装上の工夫点
仕様理解が難しい(特に各駅停車が急行通過待ちをするあたり)というのが最初の印象だったので、
の所でそこをうまく吸収できるようにあらかじめ実装してみました