È possibile implementare la programmazione "orientata agli oggetti" senza la parola chiave class?

29

Diciamo che vogliamo fornire un'astrazione di un "account" in una banca. Ecco un approccio, utilizzando un oggetto function in Python:

def account():
    """Return a dispatch dictionary representing a bank account.

    >>> a = account()
    >>> a['deposit'](100)
    100
    >>> a['withdraw'](90)
    10
    >>> a['withdraw'](90)
    'Insufficient funds'
    >>> a['balance']
    10
    """
    def withdraw(amount):
        if amount > dispatch['balance']:
            return 'Insufficient funds'
        dispatch['balance'] -= amount
        return dispatch['balance']
    def deposit(amount):
        dispatch['balance'] += amount
        return dispatch['balance']
    dispatch = {'balance': 0,
                'withdraw': withdraw,
                'deposit': deposit}
    return dispatch

Ecco un altro approccio che utilizza l'astrazione del tipo (ad es., class keyword in Python):

class Account(object):
    """A bank account has a balance and an account holder.

    >>> a = Account('John')
    >>> a.deposit(100)
    100
    >>> a.withdraw(90)
    10
    >>> a.withdraw(90)
    'Insufficient funds'
    >>> a.balance
    10
    """



    def __init__(self, account_holder):
        self.balance = 0
        self.holder = account_holder

    def deposit(self, amount):
        """Add amount to balance."""
        self.balance = self.balance + amount
        return self.balance

    def withdraw(self, amount):
        """Subtract amount from balance if funds are available."""
        if amount > self.balance:
            return 'Insufficient funds'
        self.balance = self.balance - amount
        return self.balance

Il mio insegnante ha iniziato l'argomento "Programmazione orientata agli oggetti" introducendo la parola chiave class e mostrandoci questi punti elenco:

Object-oriented programming

A method for organizing modular programs:

  • Abstraction barriers
  • Message passing
  • Bundling together information and related behavior

Pensi che il primo approccio sarebbe sufficiente per soddisfare la definizione di cui sopra? Se sì, perché abbiamo bisogno della parola chiave class per la programmazione orientata agli oggetti?

    
posta overexchange 24.05.2015 - 11:41
fonte

6 risposte

65

Congratulazioni! Hai riscoperto il ben noto fatto che l'orientamento degli oggetti può essere fatto senza un supporto specifico del linguaggio di programmazione. È fondamentalmente lo stesso modo in cui gli oggetti vengono introdotti in Schema in questo classico libro di testo . Nota che Scheme non ha una parola chiave class o un qualche tipo di equivalente, e gli oggetti possono essere creati senza avere nemmeno le classi.

Tuttavia, il paradigma orientato agli oggetti ha avuto un tale successo che molti linguaggi - e Python non fa eccezione - forniscono un supporto integrato per questo. Questo è semplicemente per rendere più facile per gli sviluppatori utilizzare il paradigma e fornire una forma standard di orientamento agli oggetti per quella lingua. È essenzialmente la stessa ragione per cui molte lingue forniscono un ciclo for , anche se potrebbe essere emulato usando un ciclo while con solo una o due linee aggiuntive di codice - semplicemente facilità d'uso .

    
risposta data 24.05.2015 - 12:28
fonte
13

Concordo sul fatto che la prima definizione soddisfi i tre punti del tuo insegnante. Non penso che abbiamo bisogno della parola chiave class per qualcosa. Sotto le copertine, cos'altro è un oggetto, ma una struttura dati con diversi tipi di dati e funzioni per lavorare con i dati? Certo, le funzioni sono anche dati ...

Vorrei andare ancora oltre e dire che fare la programmazione orientata agli oggetti non dipende tanto dalle parole chiave che la tua lingua fornisce, puoi fare programmazione orientata agli oggetti in C se lo desideri! In effetti, il kernel Linux utilizza tali tecniche.

Quello che puoi dedurre dalla parola chiave della classe è che la lingua fornisce supporto per questo tipo di costrutto fuori dalla scatola, e non è necessario attraverso tutti i cerchi per ri-implementare la funzionalità da solo (che è carina compito divertente in sé!). Per non parlare dello zucchero sintattico che potresti ottenere.

    
risposta data 24.05.2015 - 12:07
fonte
9

Certo che puoi!

Il linguaggio di programmazione autonomo è un linguaggio orientato agli oggetti basato sul prototipo dinamico in cui tutto è un oggetto e non c'è alcun senso delle classi o di qualsivoglia tipo. Si focalizza sull'idea di oggetti prototipici e sull'idea di clonarli invece di avere classi come modelli di come creare oggetti.

Dovresti controllare link per maggiori informazioni. Penso che sia molto interessante e se ti piace OOP è una buona idea controllare qualcosa che non sia così comune.

    
risposta data 25.05.2015 - 00:15
fonte
0

Non sempre: dipende dalla lingua. Hai dimostrato la capacità di farlo in Python ma (se la tua domanda è intesa come linguaggio agnostico nonostante il tag Python) non tutte le lingue possono farlo. Java, per esempio, per lo più non può. Ignorando la classe che contiene main, non c'è modo di definire metodi / campi arbitrari su un oggetto definito all'interno principale senza la parola chiave class. Sebbene esistano classi anonime, richiedono un'interfaccia e non possono avere membri pubblici ad eccezione di quelli definiti nell'interfaccia. Mentre è possibile definire interfacce personalizzate, quindi creare classi anonime per loro, questo è effettivamente lo stesso (ma meno conveniente) rispetto al semplice utilizzo di una classe.

Doc Brown ha un'ottima risposta, ma il punto che sto cercando di fare è che sono sicuro che ci sia almeno una lingua che non permetterà affatto la tua soluzione.

    
risposta data 25.05.2015 - 02:49
fonte
0

La definizione dell'insegnante manca completamente il punto più importante della programmazione orientata agli oggetti, l'unica cosa che lo rende utile e unico. "Il messaggio che passa" è un mucchio di sciocchezze inventate dalla gente di Smalltalk, ed è stato un fallimento ovunque sia stato provato. Il vero potere di OOP è qualcosa noto come sostituzione di Liskov , e mentre il concetto è abbastanza semplice da descrivere e comprendere, l'implementazione sottostante è abbastanza complessa da essere praticamente impossibile da fare senza il supporto a livello di linguaggio.

L'idea della sostituzione di Liskov è che dovunque il tuo codice si aspetti una variabile di un certo tipo, dovrebbe essere in grado di accettare qualsiasi tipo derivato da quel tipo e comunque funzionare correttamente senza dover conoscere i dettagli del derivato tipo.

Ad esempio, i framework della GUI usano la sostituzione di Liskov dappertutto. Tendono ad avere una classe base Control che può rappresentare "qualsiasi controllo", che definisce un'interfaccia che conosce azioni di base come il disegno, il ridimensionamento e la risposta all'input dell'utente. Se si fa clic su un controllo, il framework dell'interfaccia utente chiamerà un metodo Click sul controllo senza doversi preoccupare di quale tipo di controllo sia, quindi lasciare che il controllo gestisca il clic nel modo appropriato per la propria classe. Un controllo Button dovrebbe fare qualcosa di completamente diverso quando si fa clic su un controllo TextBox , per dare solo un esempio.

Quindi sì, puoi creare qualcosa di simile agli oggetti usando il trucco delle funzioni annidate descritto sopra, ma poiché non puoi ottenere l'ereditarietà e la sostituzione di Liskov in questo modo, è un sostituto estremamente limitato per il vero OOP.

    
risposta data 26.06.2015 - 16:53
fonte
-1

Risposta rapida breve

Sì, i programmatori possono applicare la programmazione orientata agli oggetti senza "Classi".

Risposta descrittiva estesa lunga e noiosa

Ci sono diverse varianti di "Object Orientation", tuttavia, il primo concetto che viene in mente a molti programmatori è "Classes".

Sì, i programmatori possono applicare la programmazione orientata agli oggetti senza "Classi", ma sono limitati alle funzionalità e ai limiti di ciascun linguaggio di programmazione.

Il tuo post è etichettato come Python , quindi il titolo della tua domanda potrebbe essere più simile a "Come implementare la programmazione orientata agli oggetti senza classi in Python".

Attualmente utilizzo la frase "Programmazione orientata agli oggetti e alla classe", per identificare da altre varianti come "Prototipazione" di Javascript o "Basata" di Visual Basic, o emulazione in "C pura" usando "funtori".

    
risposta data 25.05.2015 - 17:53
fonte