чаще всего в интернете я нахожу такую формулировку, которая предлагает каждому классу решать только одну проблему. согласно этой формулировке, если класс рассчитывает какое-нибудь значение, то функционал, отвечающий за вывод результата, не может быть в этом же классе. вывод желательно вынести в отдельный класс.
проиллюстрировать написанное можно при помощи следующих примеров:
неправильный пример
правильный пример
однако в книже роберта мартина “чистая архитектура” (стр79) даётся другое определение:
Модуль должен отвечать за одного и только за одного актора.
Модуль должен иметь одну и только одну причину для изменения.учитывая то, что роберт мартин объединил принципы SOLID, то у меня больше оснований верить его определению.
проблема в том, что согласно его определению оба приведённых выше пример правильны. потому что любой блок вызывающего кода:
circle = Circle(2) rect = Rect(4, 2) areaCalc = AreaCalc([circle, rect]) sum = areaCalc.sumArea() AreaOutput(sum).outputSum() AreaOutput(sum).outputSumRound()
может сработать по событию(актор), или в результате клика пользователя(актор) по какой-нибудь кнопочке, или в результате того, что поток выполнения программы(тоже актор) дошёл до определённого места.
для удобства привожу всю страничку из упомянутой книжки: https://pastebin.com/ZKmDBWzh