Conversation
kaito0046
left a comment
There was a problem hiding this comment.
クラス設計がそもそもうまくいっていない感じがあるので、もう一度オブジェクト指向について復習したうえで、クラス設計だけをまずはやり直していただくのがよさそうです。
07.ls_object/file_stat.rb
Outdated
| @stat = [ | ||
| file_mode_text(raw_stat), | ||
| raw_stat.nlink.to_s, | ||
| Etc.getpwuid(raw_stat.uid).name, | ||
| Etc.getgrgid(raw_stat.gid).name, | ||
| raw_stat.size.to_s, | ||
| raw_stat.mtime.month.to_s, | ||
| raw_stat.mtime.day.to_s, | ||
| raw_stat.mtime.strftime('%H:%M') | ||
| ] |
There was a problem hiding this comment.
クラス名と同名の変数がクラス内に登場する場合はたいてい設計や考え方をミスっている証拠なので、もう一度設計を考え直してみてください。
FileStat クラスは上記に該当すると思います(FileStat と @stat で厳密には同名ではありませんが、同じとみなせるかと)。
07.ls_object/ls.rb
Outdated
|
|
||
| require_relative 'file_stat' | ||
|
|
||
| class LS |
There was a problem hiding this comment.
LS という概念は、オブジェクト指向版に変更する前にあったもともとの処理を押し込めるために独自に導き出されたものに見えます。
ボウリングのスコア計算プログラムをオブジェクト指向にアレンジしたときのことを思い出していただきたいです。あのプラクティスではプログラム中に登場する概念(登場人物)をうまく見出して、インスタンス同士のやり取りに上手に落とし込めていたと思います。現状、このプラクティスでは、そういった概念設定(モデリングといいます)にそもそも失敗してる感じがあるんですよね。
登場人物には(プログラム中にしか出てこない創作の概念ではなく)一般的に世に知られる具体的なモノのみを用いる、という制限を設けてみるとよいかもしれません。lsコマンドの処理には、どのような登場人物が出てくるでしょうか?
※モデリングに失敗した状態でプログラムを書いてもうまくいきませんし、具体的なプログラムを書いてからモデリングをやり直すのは修正コストが高いので、まずはクラス図か箇条書きリストの作成だけしてから再レビュー依頼をしていただくのがよいかもしれません
There was a problem hiding this comment.
- このファイルが持っている処理がまだ多すぎるように見えます 👀 基本的にはすべての処理は何らかのクラスに持たせることができるはずだからです。このファイルは「何らかのクラスに対して処理を一度呼び、表示すべき文字列(lsコマンドの結果として表示すべき形式になったファイル一覧)を取得する」「その文字列を puts する」というくらいが妥当です。
07.ls_object/file.rb
Outdated
| @stat = [ | ||
| file_mode_text(raw_stat), | ||
| raw_stat.nlink.to_s, | ||
| Etc.getpwuid(raw_stat.uid).name, | ||
| Etc.getgrgid(raw_stat.gid).name, | ||
| raw_stat.size.to_s, | ||
| raw_stat.mtime.month.to_s, | ||
| raw_stat.mtime.day.to_s, | ||
| raw_stat.mtime.strftime('%H:%M') | ||
| ] |
There was a problem hiding this comment.
LsFile という「ファイル」を模したオブジェクトなので、理想としては @stats で配列でまとめて情報が返ってくるよりも、file_mode nilnk など個別の情報をそれぞれオブジェクトのフィールドとして持っている方が、実際の「ファイル」に近いので読み手が理解しやすくなると思います。
今回の要件では結局のところ配列に展開して文字列にするだけなのでこの書き方でも十分と言えば十分なのですが、プログラム上でオブジェクトを作ってそいつに処理を持たせて扱うという趣旨から考えると、実際に存在する概念になぞらえて作ったオブジェクトならば、(やりすぎない、無理のない範囲で)実態に沿って属性を定義したほうが理解しやすいコードになります。
lsのメインの処理を、file_listに移動。
kaito0046
left a comment
There was a problem hiding this comment.
実行してみたら file_list.rb:33: syntax error, unexpected ')' (SyntaxError) ...atrix(max_column, long_format:).map { |m| m.join.rstrip!.con... になりました。
お手元でも同様でしょうか?
07.ls_object/ls.rb
Outdated
| options = OptionParser.new do |opts| | ||
| opts.banner = 'Usage: ./ls.rb [options]' | ||
|
|
||
| opts.on('-a', 'Include directory entries whose names begin with a dot (‘.’).') | ||
| opts.on('-r', 'Display files in reverse order.') | ||
| opts.on('-l', 'List files in the long format.') | ||
| end | ||
|
|
||
| begin | ||
| params = {} | ||
| options.parse!(ARGV, into: params) | ||
| rescue OptionParser::ParseError => e | ||
| puts e.message | ||
| puts options.help | ||
| exit | ||
| end |
07.ls_object/ls.rb
Outdated
| max_column = params.include?(:l) ? 1 : 3 | ||
|
|
||
| file_names = params.include?(:a) ? Dir.glob('*', File::FNM_DOTMATCH) : Dir.glob('*') | ||
| file_names.reverse! if params.include?(:r) |
There was a problem hiding this comment.
file_names の取得も LS::FileList に任せましょう。
私の方ではエラーが出ないようです。rubyのバージョンは以下の通りです。 |
|
@thmz337 |
|
上記の点以外はよさそうに思いました。 |
こちら確認しましたが、私の方で |
kaito0046
left a comment
There was a problem hiding this comment.
本当にすみません、改めて rbenv install しなおしてバージョンを揃えたら要件通りに動作しました!何度もやりとりさせてしまい申し訳ありませんでした 🙇
No description provided.