Недавно посмотрел видеозапись выступления А. Степанова в Яндексе. В своей лекции он мечтает о том, что когда-то все алгоритмы будут объединены в некий центральный каталог, и никто не будет изобретать велосипеды в своих программах. Спору нет, идея отличная, хотя и утопия.
Но чтобы (говорит мэтр) такой каталог был возможен, надо, чтобы каждая операция (сложение там, умножение…) имела четко определенную семантику. И один из спорных моментов касается операции “плюс”. Степанов хвастается, что ни разу в жизни нигде не сделал ни одного не-коммутативного плюса. Плюс должен быть коммутативен, точка. Действительно, перестановочному закону учили еще в первом классе школы: “при перестановке слагаемых сумма не меняется”, a + b = b + a.
Очевидно, что "сложение" + "строк" немедленно оказывается за рамками всей этой красоты. И подписка на события в C# (obj.Changed += myFunc) тоже. Получается, что Perl и PHP молодцы, потому что складывают строки $вот . $так, а другие языки нарушают свойства абелевых групп, и их разработчикам должно быть стыдно.
Но правильно ли все это? Действительно ли коммутативность должна быть главным свойством сложения?
Для обычного человека (в том числе и для рядового программиста, который и слышать не слышал ни о каких абелевых группах) основное свойство сложения, интуитивно понятное, заключается в том, что в результате что-то объединяется. Было у Леши 2 яблока, а у Сережи 3 - сложили и получили 5. К ста рублям прибавили 200 и получили 300. Было две строки - сложили и получили одну длинную. Был обработчик события - прибавили к нему еще один и получили составной обработчик.
Так что, несомненно, А. Степанов крутой чел, но при всем уважении позвольте закончить статью вот этой ссылкой.