Hodnota proměnné v metodě
Občas narazíte na situaci, kdy potřebujete získat z metody hodnotu proměnné, kterou ale nemůžete vrátit pomocí return, například kvůli dalšímu zpracování kódu.
S těmito třemi případy jsem se setkal, který je podle vás nejlepší, nebo jaký způsob používáte vy?
1. Reference (WTF?)
Objective-C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class MyClass { /** * Reorder columns from table * @param $columns * @param $affected_columns * @return unknown_type */ public function ReorderColumns($columns, &$affected_columns) { /** * my reorder code... */ $affected_columns = count( $columns ); /** * next code... */ } } $affected_columns = 0; $mc = new MyClass(); $mc->ReorderColumns($columns, $affected_columns); if( $affected_columns == 0 ) { /** * my code */ } |
- nutnost definovat další proměnnou před voláním metody!
- nepřehledý kód!
2. veřejná proměnná
Objective-C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class MyClass { //count of affected columns public $affected_columns = 0; /** * Reorder columns from table * @param $columns * @param $affected_columns * @return unknown_type */ public function ReorderColumns($columns) { /** * my reorder code... */ $this->affected_columns = count( $columns ); /** * next code... */ } } $mc = new MyClass(); $mc->ReorderColumns($columns); if( $mc->affected_columns == 0 ) { /** * my code */ } |
- nepřehledý kód!
- proměnná musí být veřejná!
3. Get metoda
Objective-C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
class MyClass { //count of affected columns private $affected_columns = 0; /** * Reorder columns from table * @param $columns * @param $affected_columns * @return unknown_type */ public function ReorderColumns($columns) { /** * my reorder code... */ $this->affected_columns = count( $columns ); //$this->SetAffectedColumns(count($columns)); /** * next code... */ } /** * Getter ($affected_columns) * @return int */ public function GetAffectedColumns() { return $this->affected_columns; } /* private function SetAffectedColumns($affected_columns) { $this->affected_columns = $affected_columns; } */ } $mc = new MyClass(); $mc->ReorderColumns($columns); if( $mc->GetAffectedColumns() == 0 ) { /** * my code */ } |
Tento posledni příklad by bylo možné samozřejmě doplnit ještě o setovací funkci (zapoznámkovaná SetAffectedColumns), ale to je v tomto případě zbytečné, protože by metoda stejně nemohla být veřejná.
Posted on 6 November 2009
"kterou ale nemůžete vrátit pomocí return, například kvůli dalšímu zpracování kódu"
Tohle moc nechápu. V PHP (ale i v dalších jazycích) přeci není problém vrátit returnem víc hodnot a následně upravit volající, aby dodatečné hodnoty ignorovali či využívali. Jediný případ, kdy volající obvykle upravit nejdou, je v případě veřejné knihovny či jiného veřejného API – máte na mysli tento případ? I v takové situaci mi ale přijde správnější vytvořit novou variantu API a staré označit za deprecated.
Já bych volil 3. Podle mě není moc objektové vracet pole o n různých hodnotách, které budu dál používat. Navíc se podle mě jedná o stavovou informaci. Pokud by si s tím objektem něco dělal, pak pravděpodobně není žádoucí vykonávat znovu danou operaci, jen aby si zjistil affected columns. Druhá variant v podstatě taky není špatně, ale z mého pohledu "bad habit". Tento problém je možná až moc triviální, ale ještě mě napadlo, jestli na podobnou věc se nedá aplikovat nějaký pattern.