Rendi le cose il più semplici possibile, ma non più semplici. Questa è la regola che cerco di seguire. A volte, per una classe è effettivamente logico fare ciò che in senso stretto equivale a più di una cosa, se queste cose sono correlate su un tema comune . Guarda .NET; ci sono tonnellate di classi che implementano un gran numero di interfacce, ciascuna con la propria lista di membri richiesti. Un metodo potrebbe finire per diventare un po 'lungo se fa qualcosa di complesso con una serie di passaggi intermedi che sono tutti interconnessi e quindi non si prestano molto bene a ulteriori refactoring. (Il refactoring per mantenere i metodi brevi dovrebbe in definitiva riguardare la leggibilità e la manutenibilità, se il metodo lungo è più leggibile e / o gestibile rispetto a quello breve, a parità di altri, prenderò quello lungo ogni giorno.)
Solo "rendere le classi e i metodi il più piccoli possibile" è, a mio avviso, fuorviato. La vera sfida è, come sottolinea @c_maker, fornire buone astrazioni. Il tuo esempio di raggruppare due numeri insieme è ottimo, ad esempio, se stai lavorando su un'implementazione di numeri complessi aritmetici, o se su un sistema Unix devi fare riferimento a un contesto utente / di gruppo. Ha molto poco senso se i numeri rappresentano, ad esempio, un ID fattura e un ID prodotto da aggiungere a quella fattura.