Ho capito bene l'OOP?

1

L'avevo originariamente posto su StackOverflow. La domanda è stata chiusa e mi è stato chiesto di postare qui invece. Ecco la domanda originale che avevo postato lì:

Sto programmando da un po 'di tempo con il metodo procedurale. Ho fatto un buon numero di letture relative a OOP e so come usarlo. È solo che non sono sicuro se so ancora come usarlo correttamente? Quindi, per metterlo alla prova, sto presentando uno scheletro di un plugin che ho sviluppato usando OOP. Si suppone che il plugin recuperi valori come abbonati, seguiti ecc. Da vari social network.

// This is an abstract class used by all Social Network classes
abstract class Social_Network {
    protected $service_url,$service_identifier,$icon_url,$refresh_data;

    function __construct($arguments) {
        // Code to populate the protected variables declared above
    }

    protected function get_value_internal() {
        // Internal here means get data from cache.

        // Call get_value_external If cache data has expired or does not exist
    }

    protected function parse_json_data($data) {
        // This function parses data and gets the requested value from it
    }

    public function display_value() {
        // This is a public function which outputs the value

        // Call get_value_internal

        // Display the value with icon, etc.
    }

    //This will be different for all networks because every network would have a different method for retrieving data
    abstract function get_value_external();
}

class Facebook_Social_Network extends Social_Network {
    function get_value_external() {
        // Unique code for retrieving data from Facebook

        // Process the data fetched above and parse it using the parse_json_data function defined in our abstract class
        return $this - > parse_json_data($data);
    }
}

class Twitter_Social_Network extends Social_Network {
    function get_value_external() {
        // Unique code for retrieving data from Twitter

        // Process the data fetched above and parse it using the parse_json_data function defined in our abstract class
        return $this - > parse_json_data($data);
    }
}

class YouTube_Social_Network extends Social_Network {
    function get_value_external() {
        // Unique code for retrieving data from YouTube

        // Data returned by YouTube is processed differently so this doesn't use the shared method parse_json_data

        // Process the data and put it inside a variable named $value which will be returned below

        return $value;
    }
}

Apprezzerò se qualcuno bravo in OOP può dare una rapida occhiata e dirmi se sono in linea con la mia comprensione, vicino al bersaglio o lontano?

Una cosa che mi infastidisce è se avrei dovuto usare solo una classe che gestisse tutte le reti?

posta Prince of Nights 21.12.2012 - 17:57
fonte

2 risposte

2

Il design di base sembra OK, tranne che per avere get_value_internal() e get_value_external() come metodi pubblici separati, uno che ottiene i dati memorizzati nella cache e uno che ottiene il valore dalla rete. Un client non dovrebbe decidere quale chiamare - dovrebbe essere gestito internamente dalla classe (magari se necessario un metodo pubblico invalidate_cache() .

Inoltre, potrebbe essere meglio separare le funzionalità per ottenere i dati e visualizzarli - display_value() sarebbe meglio come metodo dell'oggetto restituito da get_value() , o forse in una classe Formatter di propria , se la funzionalità di visualizzazione è complessa.

    
risposta data 21.12.2012 - 18:13
fonte
0

One thing that's bothering me is whether I should have just used one class which would handle all Networks?

Questo diventerà veramente brutto non appena il tuo codice crescerà abbastanza. Sicuramente dovresti avere una classe base e / o alcune interfacce / tratti.

Il tuo esempio di codice sembra OK, ma è troppo piccolo per giudicare quanto bene hai afferrato i concetti di OOP.

IMO, comprendi l'OOP abbastanza in profondità per progettare grandi sistemi (questa conoscenza è necessaria ma non sufficiente) se capisci:

  • casi d'uso per ereditarietà, composizione, interfacce e tratti singoli / multipli
  • polimorfismo in generale (solo comprensione di base)
  • Principi SOLID
  • design patterns
risposta data 21.12.2012 - 18:31
fonte

Leggi altre domande sui tag