NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
MicBlack
Člen
Avatar
MicBlack:24.1.2018 14:44

Ahoj,

řeším projekt pomocí MVC architektury a chtěl jsem se zeptat - jak správě řešit volání funkcí s proměnným počtem vstupních parametrů? Například, když mám funkci, do které chci jednou poslat $id a v jiném případ $nazev.

Příklad:

public function ziskejClanek($id, $nazev) {
if ($id) {
        sql query
}
if ($nazev) {
        sql query
}
}

// zavolani funkce v jednom pripade
ziskejClanek($id);

// zavolani funkce v jinem miste aplikace
ziskejClanek($nazev);

Řešil jste to někdo?

Snad je to pochopitelné a děkuju za případnou pomoc.

 
Odpovědět
24.1.2018 14:44
Avatar
Odpovídá na MicBlack
Uživatel sítě :24.1.2018 16:47

Ahoj a co třeba to rozdělit do dvou metod:

public function ziskejClanekById($id)

public function ziskejClanekByName($name)
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
24.1.2018 16:47
Chybami se člověk učí, běžte se učit jinam!
Avatar
nekukej
Člen
Avatar
nekukej:24.1.2018 17:07
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.

 
Nahoru Odpovědět
24.1.2018 17:07
Avatar
Libi
Člen
Avatar
Libi:25.1.2018 10:55

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');
 
Nahoru Odpovědět
25.1.2018 10:55
Avatar
Michal Haňáček:25.1.2018 11:00

Musím říct, že některé ty konstrukce jsou fakt brutální 8-) .

Nahoru Odpovědět
25.1.2018 11:00
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
MicBlack
Člen
Avatar
MicBlack:25.1.2018 13:18

Díky všem za reakce..

 
Nahoru Odpovědět
25.1.2018 13:18
Avatar
Odpovídá na MicBlack
Martin Konečný (pavelco1998):25.1.2018 14:40

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ů.

Editováno 25.1.2018 14:40
Nahoru Odpovědět
25.1.2018 14:40
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.