人人都有很高的欲望在编程中表现自己的聪明。你想卖弄一下,用你高超的技巧写出一段最奇巧的代码。它让你得到少有的成就感。然而,我发现,对于大多数人来说,这对于一个项目的长期维护工作来说并不是一件好事。
比如像Ruby这样的语言,非常的灵活强大,使用这种语言耍聪明非常容易。而就像人们常说的更大的能力伴随的是更大的责任。所以,下面有一些对年轻程序员的谏言:在你的个人项目,娱乐项目中写出最奇巧的代码,以此来满足你的成就感,但在给客户做的项目中,你有责任让代码通俗易懂,请写出常规的代码。
下面是一个小例子,比较奇巧的代码和常规代码的区别。
奇巧的代码
def address_is_empty?(customer)
[:street, :city, :state, :zip].any?{|method| customer.send(method).nil? || customer.send(method).squish.empty? }
end
常规代码
def address_is_empty?(customer)
[customer.street, customer.city, customer.state, customer.zip].any?{|prop| prop.nil? || prop.squish.empty? }
end
你能理解吗?
这”奇巧”代码不难懂啊,不懂的话只能说ruby没学好…
话说常规代码多打了这么多的customer,累不累啊…这样的代码一点都不符合ruby的宗旨–“让程序员能少打一个字母就少打一个字母”
第一种写法体现了Ruby这种动态语言的灵活性,很多语言里都不能这样些,但用在这里并没有体现出多少优势,反而是第二种常规写法更易懂
再看一遍文章!
我也觉得第一种代码易懂,因为当你想看它检查了哪些属性时不需要跳过很多的「customer」。
典型的代码坏味道……这段算法本该是customer对象的职责,直接在Customer类里面去实现会比较好(严格说来,抽象出一个Address类更合适):
class Customer
def initialize(address)
@address
end
def address_is_empty?
@address.empty?
end
end
class Address
attr_accessor :street, :city, :state, :zip
def empty?
instance_variables.all? do |key|
value = instance_variable_get(key)
value.blank? || value == ’empty’
end
end
end
class Customer
def initialize(address)
@address = address
end
def address_is_empty?
@address.empty?
end
end
class Address
attr_accessor :street, :city, :state, :zip
def empty?
instance_variables.all? do |key|
value = instance_variable_get(key)
value.blank? || value == 'empty'
end
end
end