La domanda interessante è venuta fuori durante la progettazione di interfacce sul lavoro, ora risolta, ma voglio chiedere la teoria alla base.
È errato affermare che i membri dati digitati in modo corretto di una classe forniscano l'incapsulamento? (ad esempio un tipo di unità boost con conversioni ben definite tra altre unità simili, non un typedef'd / boxed uint64_t)
struct Ruler
{
Length length;
Length tick_size;
Ruler(Length length, Length tick_size);
// Why not have helpers immediately related to the class, let's
// stick in an alternative constructor
Ruler(Length length, int number_ticks);
// Accessors for # tick marks, because it needs transformed
// to/from length and tick_size
int GetNumberTicks(void);
// This specific example breaks down with this function,
// but I don't think it's an inherent issue with the design.
// I need an overload so it will know which of the two member
// variables to calculate... problem is both are Length
void SetNumberTicks(int nticks);
}
vs
struct Ruler
{
Ruler(Length length, Length tick_size);
Ruler(Length length, int number_ticks);
// General accessors
Length GetLength(void);
void SetLength(Length length);
Length GetTickSize(void);
void SetTickSize(Length length);
// Calculated accessors, see above
int GetNumberTicks(void);
void SetNumberTicks(int nticks);
private:
Length length;
Length tick_size;
}
IMO il primo incoraggia un design più pulito da parte dei consumatori e non incoraggia l'estrazione in termini leggermente correlati, ma probabilmente associati alle funzioni membro membro errate (ad es. CanMachineCreateRuler ()). Non ho davvero le parole per descriverlo correttamente e potrei fraintendere l'utilità aggiuntiva fornita dalla combinazione di dati accessors / private.