不错!
在《松本行弘的程序世界》里有这样一句话:
结构化编程基本上实现了控制流程的结构化。但是程序流程虽然结构化了,要处理的数据却并没有被结构化。面向对象的设计方法是在结构化编程对控制流程实现了结构化后,又加上了对数据的结构化。
“类”就是一个结构体,包括流程和数据。
类是对象的模板,相当于对象的雏形。
我觉得OrderChargeLogic
设计成一个 module 可能会更合理些。
#9 楼 @flowerwrong 都是 extract method 的方法,但 concern 有一点局限性: Service Object 更适合组织多个 model 之间的交互。 Concern 需要 ActiveSupport::Concern 才能玩的转,而 Service Object 就是普通 Object。
很赞成这种理解,简单明了。而且大多数情况下,mvc 已经完全足够用。即便有重复的代码,想要重用,搞一个 service 层也不一定是“划算”的。
比如我们项目中,在 grape 的 api 里有大量代码逻辑其实和 controller 重复的,但是因为 grape 语法里 present,error,以及 params 的验证等 dsl 语法很多。将这部分代码抽出到 model 或者重新建一个 service 都是非常繁杂的过程,而且会生产很多 ugly 的代码,api 的改动和升级也会造成很多麻烦,反而会增加很大的阅读和维护难度。
Rails 里的 concern 也只是一种多重继承的 mixin 的实现方式,自己也可以实现,更多的只是为了代码的复用,并没有实现“加一层”的概念。不过如果项目真的复杂,构建一个 service 层也不是很难。
第一宗罪:增加集成客户端组件的复杂度
theme 升级的时候太痛苦了!
希望后面能看到视频。
今天又改了改,参考了下其他的 grape http cache gem,加上了缓存的配置,而不是直接调用 Rails.cache 了。
44
这是我们的,忘记原文在哪里了。
desc "Database related tasks"
namespace :database do
desc "Convert to utf8mb4"
task convert_to_utf8mb4: :environment do
connection = ActiveRecord::Base.connection
database = connection.current_database
connection.execute "ALTER DATABASE #{database} CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;"
puts "Converted #{database} character set"
# Change all tables
connection.tables.each do |table|
connection.columns(table).each do |column|
if column.sql_type == "varchar(255)"
puts "#{column.name} is varchar(255)"
# Check for 255 indexed columns
connection.indexes(table).each do |index|
if index.columns.include?(column.name)
puts "#{column.name} has index, altering length..."
connection.execute "ALTER TABLE #{table} CHANGE `#{column.name}` `#{column.name}` varchar(191);"
puts "...done!"
end
end
end
end
puts "Converting #{table}..."
connection.execute "ALTER TABLE #{table} CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
puts "...#{table} converted!"
connection.columns(table).each do |column|
if column.type == :string || column.type == :text
puts "Converting #{column.name}..."
connection.execute "ALTER TABLE #{table} CHANGE `#{column.name}` `#{column.name}` #{column.sql_type} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
puts "...#{column.name} done!"
end
end
puts "Repairing #{table}..."
connection.execute "REPAIR TABLE #{table};"
puts "...#{table} repaired!"
puts "Optimizing #{table}..."
connection.execute "OPTIMIZE TABLE #{table};"
puts "...#{table} optimized!"
end
end
end
环境好棒!
#68 楼 @linjunzhugg rails 渲染页面慢只是因为几个 help 方法,如果 view 是纯 html 并且没有其他的 ruby 代码,加上片段缓存和不加效果是差不多的。
能实现复杂的前端功能
楼主涉猎好广泛。。
好多妹子!
挺不错的文章。
:plus1:
先赞后看。
<=>是 ruby 方法里最神奇的方法之一,很多类关于比较的方法,都会调用这个方法,通过重写这个方法来实现自定义排序和比较。
:plus1:
However vfork(2) is still not well understood and a potentially harmful system call. We would like to experiment to find out how much benefit can be gained by gathering performance data and use cases.
赞
赞