56.3.3. Connascence of Position

:orders => {
    "3" => "1",
    "5" => "2",
}

Translate params hash to a List of Pairs.

[
    [Order.find(3), true],
    [Order.find(5), false]
]

Tento seznam dvojic byl pak zpracováván metodou procsss_orders.

def process_orders(list_of_pairs)
    list_of_pairs.each do |order, expedite|
        # handle an order
    end
end

Na pořadí prvků ve dvojicích záleží!

class OrdersController
    def build_order_list(params)
        [order, flag]
    end
end

class Orders
    def process_orders(pairs)
        pairs.each do |order, flag| … end
    end
end

Jiný příklad. Jednoduchá forma Connascence.

Customers.find(["last_name = ?", "Weirich"], "age")

def find(conditions, ordered_by)
    …
end

A složitější forma Connascence.

Customers.find(["last_name = ?", "Weirich"], "age", 12, 24, ['first_name', 'last_name'])

def find(condition, order_by, limit, offset, slected)
    …
end

Takovou složitou formu CoP je lépe převést na CoN

Customers.find(
    :conditions => ["last_name = ?", "Weirich"],
    :order_by => "age",
    :limit = > 12,
    :offset => 24,
    :select => ['first_name', 'last_name'])

def find(options={})
    …
end

Connascence of Position při testování. Následující příklad při testování vybírá prvníhoo uživatele z databáze.

def test_user_can_do_somethin_interesting
    user = User.find(:first)
    …
end

Na různých počítačích/databázích, u různých vývojářů může být tímto prvním uživatelem jiný člověk. Případně pokud nění stanoveno nějaké pořadí, může databázový stroj pokaždé vrátit jiného uživatele. To pak vede k chybám které se projevují podle toho na kterém počítači/databázi byl test spuštěn. Tomuto případu se vyhneme, když zadáme konktrétního uživatele z databáze.

def test_user_can_do_somethin_interesting
        user = User.find(:first)
        user = User.find(:first)
        user = User.find(:first)
        user = User.find_by_name("Jim")
    …
end

Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .