Skip to content

Instantly share code, notes, and snippets.

@kamillle
kamillle / gist:fe5041c90a06cce2aee69917c86daaba
Created November 2, 2018 03:34
DDDのアグリゲートについて
DDDのアグリゲート
e.g: オブジェクトの所有権と境界を定義するのに使うパターン
↓ (僕の理解)
アグリゲートは、そのアグリゲートに属する複数オブジェクト間のデータの不変性を保証する
(rails のhas_many の inverse_of や dependent: :destroy などが例)
あるアグリゲート(ここではAとする)は一つのルートを持ち、Aのアグリゲートに属さない外部のオブジェクトからAのアグリゲートに属するオブジェクトにメッセージを送りたい場合は、ルートを通してでしかアクセスできない。
アグリゲート内のオブジェクトは、お互いを参照できる(ex: has_one, belongs_toなど)。
class DateBase
def self.get_property(mail_address)
self.resources.select { |resource| resource[0] == mail_address }.last[1]
end
def self.resources
[
['uchinishi@mf.com', '4geru'],
['nandate@mf.com', 'tnandate']
]
require 'singleton'
class BigChar
attr_accessor :charname, :fontdata
def initialize(charname)
@charname = charname
begin
line = ""
@kamillle
kamillle / gist:a32d77d256c4483651d8683a487a8af5
Created January 1, 2019 18:26
The Single Responsibility Principle(単一責任の原則)
# なぜやるか
役割が単一なクラスの仕様が変更になった場合、その変更部分は把握しやすいから。
単一でない場合、1つの箇所を変えた時にどのような挙動が起こるか想定しずらくこれはもろい設計に当てはまる。
# どう分けるか
変更する理由が同じ場合は同じクラス(やモジュールとか)に、理由が異なる場合は違うクラスに分けるべき。
下記の例だとEmployeeクラスに住んでいる3つのメソッドはそれぞれ異なる理由で変更される可能性がある。
calculate_payrollは給与計算の計算式が変更されたら対応して修正しないといけないし、report_hoursはレポートのフォーマットが変更されるたびに修正が必要だ。つまり今のEmployeeクラスは様々な変更される理由を持っていて、そのたびにこのクラスとこのクラスに依存している他のクラスや処理を変更しないといけなくなる。
最適なクラス設計は、calculate_payrollが変更されても、この処理に依存していた他のクラスのインタフェースには変更が入らないことだ。
@kamillle
kamillle / 20190504_rails_bug_test.rb
Created May 6, 2019 10:35
null: falseの制限が効いてないものの調査。
begin
require 'bundler/inline'
rescue LoadError
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
raise
end
gemfile(true) do
source 'https://rubygems.org'
@kamillle
kamillle / 20190504_rails_bug_test.rb
Created May 6, 2019 10:35
null: falseの制限が効いてないものの調査。
begin
require 'bundler/inline'
rescue LoadError
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
raise
end
gemfile(true) do
source 'https://rubygems.org'
class HogesController
before_action :set_hoge
before_action :redirect_to_home_path_if_request_invalid
def create
if @hoge.save(hoge_params)
# ok
else
render :new
end

ActiveModel::Attributes APIの attribute メソッドを使用して値のcastを行う場合に、shoulda-matchersが提供するマッチャを使ってバリデーションのテストを行おうとすると 意図しない挙動によってテストが落ちてしまう。

サンプルコード

class SampleForm
  include ActiveModel::Model
  include ActiveModel::Attributes
NameError: undefined local variable or method `view_context' for #<TestController:0x00007fd232cc0f40>
Did you mean? view_runtime> with backtrace:
# ./.bundle/gems/active_decorator-1.3.0/lib/active_decorator/monkey/action_controller/base/rescue_from.rb:10:in `rescue_with_handler'
# ./.bundle/gems/actionpack-5.2.3/lib/action_controller/metal/rescue.rb:25:in `rescue in process_action'
# ./.bundle/gems/actionpack-5.2.3/lib/action_controller/metal/rescue.rb:21:in `process_action'
# ./.bundle/gems/actionpack-5.2.3/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
# ./.bundle/gems/activesupport-5.2.3/lib/active_support/notifications.rb:168:in `block in instrument'
# ./.bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
# ./.bundle/gems/activesupport-5.2.3/lib/active_support/notifications.rb:168:in `instrument'
# ./.bundle/gems/actionpack-5.2.3/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
@kamillle
kamillle / override_rack_test_cookie_jar.rb
Last active April 2, 2020 18:22
Rack::Test::CookieJarをoverrideしても暗号化されたクッキー扱えないやつ