Per la mia classe di programmazione dello sviluppo del software dovevamo creare un programma di tipo "Feed Manager" per i feed RSS. Ecco come ho gestito l'implementazione di FeedItems.Non c'è un punto in cui l'incapsulamento diventa ridicolo?
Nizza e semplice:
struct FeedItem {
string title;
string description;
string url;
}
mi sono segnato per questo, il "corretto" esempio risposta è la seguente:
class FeedItem
{
public:
FeedItem(string title, string description, string url);
inline string getTitle() const { return this->title; }
inline string getDescription() const { return this->description; }
inline string getURL() const { return this->url; }
inline void setTitle(string title) { this->title = title; }
inline void setDescription(string description){ this->description = description; }
inline void setURL(string url) { this->url = url; }
private:
string title;
string description;
string url;
};
Ora per me, questo sembra stupido. Onestamente non posso credere di essere stato segnato, quando fa esattamente la stessa cosa che fa il mio con un sovraccarico molto più alto.
Mi ricorda di come in C# le persone fanno sempre questo:
public class Example
{
private int _myint;
public int MyInt
{
get
{
return this._myint;
}
set
{
this._myint = value;
}
}
}
Voglio dire che OTTENGO perché lo fanno, forse in seguito vogliono convalidare i dati nel setter o incrementalo nel getter. Ma perché non la gente fa semplicemente questo FINO a questa situazione?
public class Example
{
public int MyInt;
}
Spiacente, questo è una specie di sproloquio e non realmente una domanda, ma la ridondanza è esasperante per me. Perché i getter ei setter sono così amati, quando non sono necessari?
Se pensi che sia ridicolo, non hai usato una libreria con una classe Factory singleton che ha un metodo che restituisce una singola istanza di Manager con un singolo metodo che restituisce le classi di Mapper che restituiscono le classi con Proprietà che contengono stringhe di SQL dichiarazioni. Oh, e ogni classe intermedia ha un'interfaccia. –
Se lo fai a modo tuo fino a quando non è necessario cambiarlo, è già troppo tardi. Hai un titolo membro (che è una stringa). Ma a volte lungo la strada dobbiamo cambiare l'implementazione in un array di caratteri. Poi sfortunatamente la tua implementazione è bloccata (tutti usano già il titolo (e la sua parte dell'API pubblica) e non puoi farli cambiare, quindi non puoi cambiare la tua implementazione. Se nascondi l'implementazione dietro un metodo set, allora come si implementa la parte privata non è esposta e quindi può essere modificata. –
Personalmente odio i geter/setter (è simile a Java e non è simile a C++) .Perché stai armeggiando con gli interni dell'oggetto. Non sembra che abbia senso per modificare questi membri una volta creati (ma questo dipende dai requisiti di utilizzo). Vorrei rendere privati tutti i membri, costruttore per crearli e vedere come viene utilizzato l'oggetto. L'aggiunta di getter/setter non laccati è quasi tanto grave quanto avere una variabile pubblica –