Si può considerare un linguaggio vagamente tipizzato orientato agli oggetti vero?

6

Un linguaggio di programmazione vagamente tipizzato come PHP può davvero essere considerato orientato agli oggetti?

Voglio dire, i metodi non hanno tipi di ritorno e i parametri del metodo non hanno neanche un tipo dichiarato.

La progettazione della classe non richiede che i metodi abbiano un tipo di reso? Le firme dei metodi non hanno parametri specificati in modo specifico?

In che modo le tecniche OOP possono aiutarti a programmare in PHP se devi sempre controllare i tipi di parametri ricevuti perché la lingua non impone i tipi?

Per favore, se ho torto, spiegamelo.

Quando progetti cose usando UML, quindi classi di codice in PHP senza metodi tipizzati di ritorno e parametri di tipo non specificato ... Il codice è veramente conforme al design UML?

Trascorri del tempo a progettare la tua architettura software, quindi il compilatore non costringe il programmatore a seguire il tuo progetto durante la codifica, lasciando che assegni qualsiasi variabile oggetto a qualsiasi altra variabile senza avviso di "mancata corrispondenza di tipo" .

    
posta Tulains Córdova 21.08.2012 - 04:26
fonte

4 risposte

17

Gli attributi classici di OOP sono: ereditarietà, polimorfismo e incapsulamento. Nessuna menzione della tipizzazione strong.

Non conosco PHP, ma ho codificato OOP Python e mi sembra proprio come C OOP.

    
risposta data 21.08.2012 - 05:24
fonte
8

Doesn't class design need methods to have a return type?

Perché? Non stai modificando il codice stesso in fase di runtime, quindi il metodo ha un tipo restituito, indipendentemente dal fatto che sia predetto. Solo perché non può essere applicato, non significa che non esista: può essere chiaramente dedotto dal codice stesso.

Doesn't methods signatures have specifically-typed parameters ?

Ancora una volta, non c'è niente da dire che il metodo non possa essere semplicemente liberale in ciò che riceve. Ottieni utente per ID? Certo, passa una stringa o un intero. Come si rompe la programmazione orientata agli oggetti ?

How can OOP techniques help you code in PHP if you have to always check the types of parameters received because the language doesn't enforce types ?

Qui, in base agli argomenti di cui sopra, non riesco ancora a capire perché il "controllo extra", anche se necessario, rende impotenti le tecniche OOP.

Le lingue a caratteri generici che ho familiarità con non hanno sovraccarico del metodo , che viene spesso utilizzato per fare metodi più flessibili sull'input (pur usando sempre lo stesso nome), quindi non vedo molta differenza dall'uso di un metodo e di un "extra check". Uno sviluppatore diligente può scrivere lo stesso metodo, con lo stesso contratto, stabilità e sicurezza in un linguaggio non tipizzato.

When you design things using UML, then code classes in PHP with no return-typed methods and no-type parameters... Is the code really compliant with the UML design ?

Beh, dipende dal tuo stesso metodo, vero? Cosa fa realmente con gli input e cosa emette?

La digitazione esiste ancora

La linea di fondo è che i tipi esistono ancora, sono solo loose o weak 1 , e questi sistemi possono even ha alcuni vantaggi .

In effetti, alcuni IDE come quelli di JetBrains (IntelliJ, PHPStorm) supportano tutti i tipi di digita suggerimento usando PHPDocs per PHP . Come ho usato, fornisce quasi tutti gli avvertimenti convenienti, click-through, completamento del codice, ecc. Che può fornire un IDE per un tipo strongmente tipizzato.

1: Sia "loose" che "weak" sono comunque solo un gruppo scarso; ci sono così tanti diversi tipi di sistemi che questi termini possono causare confusione. Vedi la prospettiva informativa di Eric Lippert su questo argomento su Stack Overflow.

Metodo doc ed esempio in linea

/**
 * @static
 * @param mixed $id
 * @return User
 */
public function getUserById($id) {
    ....
}

public function printUserName() {
    // code completion provided on getName method because of @return
    $name = $this->getUserById("5")->getName();

    // type hinting for arrays
    /** @var User[] $users */
    $users = array(new User());
}

Esempio di casting

public function checkUser(User $user) {
    if ($user instanceof Administrator) {
        /** @var Administrator $admin  */
        $admin = $user;
        $admin->logAccess();
    }
}
    
risposta data 21.08.2012 - 04:44
fonte
5

Il linguaggio originale orientato agli oggetti in cui Alan Key ha introdotto il concetto era Smalltalk . È digitato in modo dinamico.

In realtà Alan Key ha menzionato l'approccio di classi e interfacce di C ++ e Java è non ciò che aveva in mente quando ha inventato la programmazione orientata agli oggetti. Quindi la domanda dovrebbe forse anche essere l'altra, se i linguaggi tipizzati staticamente possono essere veramente orientati agli oggetti.

I mean, the methods don't have returning types and method parameters has no declared type either. Doesn't class design need methods to have a return type? Doesn't methods signatures have specifically-typed parameters?

No, non hanno specificatamente digitato parametri. I loro parametri e valori di ritorno devono avere un insieme specifico di metodi, ma non devono essere tipi specifici. In linguaggi tipizzati staticamente che viene applicata dichiarando un'interfaccia. In quelli digitati dinamicamente, devi solo documentarlo.

How can OOP techniques help you code in PHP if you have to always check the types of parameters received because the language doesn't enforce types?

Non dovresti mai controllare i tipi di parametri ricevuti. Dovresti semplicemente chiamare metodi su di loro. Si chiama "duck typing" (se cova come un'anatra e cammina come un'anatra, io la definirei un'anatra, o se ha metodi come X, lo farà per X). È come le cose vengono solitamente fatte in smalltalk, perl, python, ruby ecc. E come dovrebbero essere fatte in PHP.

    
risposta data 21.08.2012 - 10:18
fonte
3

Doesn't class design need methods to have a return type?

Non proprio.

Doesn't methods signatures have specifically-typed parameters ?

Certo. Solo perché i tipi non sono applicati dal compilatore non significa che non ci sia un contratto implicito e una semantica che i metodi richiedono / implementano.

How can OOP techniques help you code in PHP if you have to always check the types of parameters received because the language doesn't enforce types ?

Concentrandosi sulla programmazione orientata agli oggetti. Di nuovo, come organizzi i contratti impliciti di linguaggi dinamici nel tuo progetto è dove OO entra in gioco.

    
risposta data 21.08.2012 - 04:41
fonte