Patrzac na pierwszą metode.
-
if ARGV[0] == nil
rubiowiec zapisałby pewnie jako if ARGV[0].nil?
, a idac dalej ten if sprawdza czy zostal podany jakis argument z cmdline, wiec zapisałbym go jako if ARGV.empty?
żeby oddać intencje
-
if ARGV[0] == nil
text = File.read("text.txt")
else
begin
text = File.read(ARGV[0])
rescue
puts "\t No file\n\n"
end
end
powielone File.read
. Żeby to zrefaktorować możnaby najpierw ustalić filename i potem to wykorzystać, czyli
if ARGV.empty?
filename = "text.txt"
else
filename = ARGV.first
end
begin
text = File.read(filename)
rescue
puts "\t No file\n\n"
end
co możnaby jeszcze uprościć
filename = ARGV.empty? ? "text.txt" : ARGV.first
i jeszcze
filename = ARGV.first || "text.txt"
To nieco zmienia oryginalny flow, bo puts "\t No file\n\n"
może sie wyświetlić też przy błędzie w czytaniu pliku text.txt
. I tu dochodzimy do sedna sprawy bo co tak naprawde ma znaczyć No file
dla użytkownika twojego programu? Bo jeśli ma sygnalizować, że plik, który podał jako cmdline argument nie istnieje, to nie spełnia swojej funkcji, bo np rescue
złapie też Errno::EACCES
i pokażesz “No file” mimo, że plik istnieje, tylko nie masz prawa go czytać.
2a) Jako bonus, File.read("text.txt")
wywali się jeśli odpalimy script.rb
, bedac w katalogu (cwd) innym niz ten w którym są oba te pliki. Pomyśl jak to naprawić.
-
begin
text.gsub!(/[^a-zA-Z ]/, "").downcase!
words = text.split(" ")
rescue
words = [50, 50]
end
jaki bład ten rescue łapie? Czyżby NoMethodError na nil.gsub!
w przypadku kiedy powyżej File.read
zawiodło? To brzydka praktyka sterowaniem flowu programu za pomocą wyjątków, kiedy mogłeś to sprawdzić if
em.
-
words = [50, 50]
Co to za magiczne liczby? https://en.wikipedia.org/wiki/Magic_number_(programming)
Nazwij je (stałe?), bo sie przewijają niżej wielokrotnie te same liczby i nie wiem czy to to samo, czy tylko wartość ta sama?
if @db_array[i] > 50
tmp = (50 - @db_array[i]).abs
etc.
Tam samo dla innych magic numbers, np
elsif emo >= 60 and emo < 100
-
return words
w ruby pomijamy slowko return w takich sytuacjach.
Patrzac kawałek dalej:
def scale_values
random = rand(0..1)
i = 0
while i < @db_array.size
if i % 2 == 0 and random == 0
scale_partial(i)
else
scale_partial(i)
end
i += 1
end
end
-
takiego while
raczej nie widuje sie w ruby, i pewnie byłoby to zapisane np jako
@db_array.size.times do |i|
end
-
do tego i % 2
jest metoda.
-
zwykle dobrze jeśli if
i else
robią co innego
etc, etc