Non penso proprio. Allora mettiamola così, io creo un attributo privato, anzi no pubblico, però è una variabile che ha senso solo ed esclusivamente all'interno del contesto della classe, cioè all'esterno perde totalmente significato.. immagina l'handle di un processo o di un thread parallelo. Io adesso ho questo attributo pubblico, lo posso modificare dall'esterno e invece dell'handle che dovrebbe avere ne metto un altro. Quale beneficio mi porta aver dichiarato pubblico quell'attributo?sydarex ha detto:Appunto, rendere un membro private limita il riutilizzo del codice, in quanto l'utilizzatore è limitato nell'utilizzo; private limita l'utilizzo della classe per i task per cui è stata pensata.
Si, è per il secondo motivo. Ti faccio un ulteriore esempio. Io creo una classe con degli attributi, alcuni attributi (che ne so, variabili intere) devono rimanere all'interno di un range per essere 'sensate' (vedi i mesi di un anno 1-12). Ora, io posso rendere l'attributo pubblico, ma, dall'esterno, chi lo modifica potrebbe mettere qualsiasi valore all'interno dell'attributo stesso. Ora, possiamo fare un controllo d'integrità ogni volta che dobbiamo manovrare con tale attributo, oppure eliminare il problema alla radice. Fornire un metodo get che restituisce il valore dell'attributo, e un metodo set che invece lo setta, solo ed esclusivamente se il valore passato è coerente con quello che deve contenere.sydarex ha detto:Non ho capito. Se ciò che volevi scrivere è una domanda, allora:
- Tu se codi una classe e vuoi mantenere un attributo privato (intendo: per uso interno), realizzi le set/get?
- Ha senso utilizzare set/get invece che modificare direttamente i membri? A che pro, incapsulamento? Mi pare un ragionamento fallace, una cosa che si fa per abitudine, ma ti sarei grato se ti spiegassi meglio.
Private non limita niente, ti ho già detto come fare per poter ovviare al problema, incapsulamento, protected, e, anzi, ne aggiungo un altro, classi friend. Ora, se io invece volessi proprio che una classe non possa ereditare un bel niente ma solo quello che gli dico io? Cosa dovrei fare? Visto che tu dici che il private non dovrebbe essere usato e nemmeno il protected.sydarex ha detto:Ma è proprio l'utilità dell'incapsulamento che critico, e che è FUORI dalla definizione teorica originaria della programmazione orintata agli oggetti.
Quanto a protected, ancora, non ne vedo l'utilità ancora più che di private, visto che mi basta fare una classe wrapper per aggirarla.
Non è meglio usare una convenzione per i metodi privati (come l'underscore iniziale, o ancora addirittura il name mangling se proprio si vuole), visto che:
- Private limita l'uso, il riuso e l'estendibilità della classe
- Protected è aggirabile
Quindi:
- Se questa filosofia di OOP è per ARRESTARE l'uso libero del codice, allora fallisce perché aggirabile;
- Se questa filosofia di OOP è per EVITARE GLI ERRORI PERMETTENDO L'USO LIBERO CONSAPEVOLE, allora fallisce perché va aggirata artificiosamente.
In entrambi i casi fallisce.
Non capisco cosa intendi quando dici che protected è aggirabile, è nato proprio per dare la possibilità di accesso ai membri della classe da una classe derivata.