Quando si applica la separazione delle interfacce, si dovrebbero avere interfacce separate per setter e interfacce semplici che eseguono un'operazione prima dell'impostazione? Ad esempio, supponi di avere una classe:
class FooClass:
public GettableFoo,
public SettableFoo
{
virtual int getRelevantData();
// member of GettableFoo (which is used by roughly 20 clients)
virtual void setToOtherFooTemplate(GettableFoo *other);
// member of SettableFoo (which is used by roughly 20 clients, some of which also need GettableFoo interface)
void setToSum(GettableFoo *a,GettableFoo *b);
// requires SettableFoo functions to implement, used by 8 clients, some of which also need SettableFoo interface
void combineSomeOtherWay(GettableFoo *a,GettableFoo *b);
// requires SettableFoo functions to implement, used by 4 clients (possibly more in the future), some of which also need SettableFoo interface and/or which require the setToSum function
private:
// complex data
}
Il principio di segregazione dell'interfaccia afferma che nessun client dovrebbe essere costretto a dipendere da metodi che non usa. Significa che setToSum () e combineSomeOtherWay () dovrebbero avere le proprie interfacce? La risposta sembra che dovrebbe essere sì, ma non credo di aver mai incontrato un codice con interfacce segregate così tanto.
Se la risposta a quanto sopra è sì, non significherebbe se combineSomeOtherWay () fosse solo setToProduct () (moltiplica) e io abbia usato l'overloading dell'operatore per entrambi per implementare questo in C ++, che tecnicamente il sovraccarico dell'operatore interromperebbe il principio di segregazione dell'interfaccia, date le esigenze del cliente sopra indicate? E se così fosse, la maggior parte dei casi in cui viene utilizzato il sovraccarico dell'operatore sta rompendo l'ISP, e in caso contrario, come è diverso dal non segregare nessuna delle interfacce nella classe sopra?