Здравко обнови решението на 26.10.2014 14:36 (преди около 10 години)
+class NumberSet
+ include Enumerable
+
+ def initialize()
+ @container = []
+ @complex_container = []
+ end
+
+ def <<(value)
+ if ! @complex_container.include? value.to_c
+ @container.push value
+ @complex_container.push value.to_c
+ end
+ end
+
+ def size
+ @container.count
+ end
+
+ def empty?
+ @container.empty?
+ end
+
+ def each(&block)
+ @container.each &block
+ end
+
+ def [](current_filter)
+ current_filter.filter(@container)
+ end
+end
+
+class Filter
+ attr_accessor :condition
+
+ def initialize(&block)
+ @condition = block
+ end
+
+ def filter(container)
+ container.select &condition
+ end
+end
+
+class TypeFilter
+ attr_accessor :type
+ attr_accessor :types
+
+ def initialize(type)
+ @type = type
+ @types = { :integer => Fixnum,
+ :real => [Rational, Float], :complex => Complex }
+ end
+
+ def filter(container)
+ container.select { |n| n.instance_of? @types[@type] }
+ end
+end
+
+class SignFilter
+ attr_accessor :sign
+ attr_accessor :signs
+
+ def initialize(sign)
+ @sign = sign
+
+ @signs = { :positive => ">", :non_positive => "<=",
+ :negative => "<", :non_negative => ">=" }
+ end
+
+ def filter(container)
+ container.select {|n| n.send @signs[@sign], 0}
+ end
+end
- Не виждам каква беше целта на
@complex_container
. Ако погледнеш как работятArray#include?
и==
за числа, ще разбереш, че правиш нещата доста по-complex, отколкото е нужно да са. (: - Правиш черни
send
магии вSignFilter
. Проблемът е достатъчно прост, за да няма нужда от метапрограмиране. - Всички
attr_accessor
-и нямаше причина да съществуват. С тях нарушаваш Law of Dementer, който е един от градивните принципи за добър ООП дизайн. Опитвай се да криеш имплементацията за външния свят и не давай повече достъп, отколкото е нужно. - Опитай се да измисляш имена, по-близки до семантиката, която искаш да изкажеш.
@container
е ясно, че съдържа нещо, въпросът е какво?block
е ясно, че е блок, но какво прави? По принцип е добре предикатите да завършват на?
. Тукfilter?
ще е малко подвеждащо, но се опитай да измислиш име, което да задава въпрос. - Какво ще стане с
TypeFilter#filter
, ако се прави проверка с:real
? - Не си имплементирал
|
и&
за филтри. Най-лесно би било ако го сложиш въвFilter
и другите го наследяват. Ако нямаш идея как да започнеш самата имплементация, а не просто не си имал време, не се притеснявай да питаш във форумите/да пратиш email.