Diskuze: Volání fce s proměnlivým rozhraním
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj a co třeba to rozdělit do dvou metod:
public function ziskejClanekById($id)
public function ziskejClanekByName($name)
function ziskejClanek($nazevSloupce, $hodnota){
// SQL query
}
$clanek1 = ziskejClanek('nazev', 'nazev clanku');
$clanek2 = ziskejClanek('id', 456);
nebo
function ziskejClanek($id = NULL, $nazev = NULL){
if($id !== NULL){
// SQL query2
}else{
// SQL query1
}
}
$clanek1 = ziskejClanek(NULL, 'nazev clanku');
$clanek2 = ziskejClanek(456, NULL);
Ale tohle není dobrý nápad. Spíš bych se přiklonil té první a nebo využít možnost co je napsaná výše.
Treba takhle?
public function ziskejClanek($arg) {
if (isset($arg['id'] AND is_int($arg['id']) {
sql query
}
if (isset($arg['nazev'] AND !empty($arg['nazev'])){
sql query
}
}
// zavolani funkce v jednom pripade
ziskejClanek(array('id'=>'123');
// zavolani funkce v jinem miste aplikace
ziskejClanek(array('nazev' => 'abc');
Musím říct, že některé ty konstrukce jsou fakt brutální .
Ahoj, osobně bych to spíše rozdělil na dvě odlišné funkce, protože jedna funkce by měla dělat jednu konkrétní věc, čili třeba "hledat podle ID" nebo "hledat podle názvu".
Když bych dělal nějakou obecnou metodu, kde můžu hledat podle více libovolných parametrů, pak to budu řešit postupným skládáním dotazu dle parametrů, velmi zjednodušeně např.:
function ziskejClanek(array $parametry)
{
$sql = "SELECT * FROM clanek WHERE";
if (isset($parametry["nazev"])) {
$sql .= " nazev = ''{$parametry[nazev]}";
}
if (isset($parametry["datum"])) {
$sql .= "AND datum = '{$parametry[datum]}'"
}
// zavolání dotazu do DB
}
$clanek = ziskejClanek(array(
"nazev" => "Test",
"datum" => "2018-01-25"
));
Pokud ovšem hledám článek dle jednoho konkrétního parametru, pak bych definoval dvě různé metody, tedy
function ziskejClanekDleId($id)
{
// vyhledání pomocí ID
}
function ziskejClanekDleNazvu($nazev)
{
// vyhledání pomocí názvu
}
$clanek = ziskejClanekDleId(123);
$clanek2 = ziskejClanekDleNazvu("Test");
Důvod je prostý - čitelnost. Pokud budu mít jednu funkci, která bude dělat dvě odlišné věci dle toho, jestli vyplním první nebo druhý parametr, jednak v tom bude zmatek, zvýší se chybovost a když budu chtít hledat článek třeba ještě podle data, tak přidám třetí parametr? A když i podle autora, přidám čtvrtý parametr? Tohle se mi zdá jako špatný způsob, protože tím akorát zvyšuješ tu "zmatečnost".
Pokud budu chtít přidat hledání článku nově i konkrétně dle data, stačí mi pro to udělat novou funkci.
function ziskejClanekDleData($datum)
{
// vyhledání pomocí data
}
$clanek = ziskejClanekDleData("2018-01-25");
Pokud by takových funkcí začalo být moc a kód by se začal v podstatě opakovat, jen by se vždy změnila jedna malá část (v tomto případě by bylo vše stejné kromě jednoho WHERE v SQL dotazu), tak by stálo za to, pouvažovat, zda by to nešlo nějak zjednodušit, aby se kód neopakoval (tzv. pravidlo DRY - https://cs.wikipedia.org/…eat_yourself), třeba pomocí výše zmíněné "obecné" metody, která přijímá pole parametrů.
Zobrazeno 7 zpráv z 7.