>>24058 Да.
>>24048Более идиотского обоснования я еще не слышал. Видимо, последний пункт требует пояснения. Твой код будут не только читать, но и править, а значит, не только скорость его чтения и понимания, но и
скорость его правки должна быть максимальной. Проблема описанного тобой подхода в том, что скорость правки как раз-таки не максимальная. Даже если другой человек полностью восстановит контекст твоего исходного кода у себя в голове, ему все равно придется тратить лишнее время, чтобы изменить его логику.
Если ты хочешь запретить определенные действия с твоим исходником, то отзови права на запись в тех местах, которые по твоему мнению не подлежат правке (что человечество пока не научилось делать, поэтому следующий пункт); либо расставь в коде "грабли", которые ударят, если программист попытается сделать с твоим кодом заведомо ошибочные действия. Например, если ты хочешь, чтобы в классе, который наследуется от твоего "SimpleDialog", нельзя было переопределять метод "addWidget()", то пометь его в своем классе модификатором "final" ("не переопределяемый").
А запрещать или хотя бы осложнять законные действия над исходником больше подходит саботажнику, нежели профессионалу.
Да, что касается кодогенераторов. Это оффтопик, но я все же скажу, потому что чем раньше ты это поймешь, тем меньше говнокода успеешь нагенерировать.
Существует несколько классов программного кода:1) Исходный. Он целиком и полностью определяет поведение программы, но машина не может исполнять его напрямую.
2) Объектный. Он также целиком и полностью определяет поведение программы, но в отличие от исходного кода, он может исполняться машиной напрямую. Его содержание однозначно определяется исходным кодом. Он может совпадать с исходным (например, в случае скриптовых ЯП).
3) Генерируемый. Это промежуточный код, который формируется сборщиком программы (системой, создающей объектный код из исходного) исключительно для своего удобства. К нему относятся, например, "объектники" ("*.o"), формируемые GCC на этапе компиляции. В теории выделять этот класс программного кода нет необходимости, но на практике иногда удобно иметь часть внутреннего кода, создаваемого сборщиком, под рукой. Например, в случае, когда часть исходного кода написана на C++, а часть — на DSL, из которого потом формируются некоторые заголовочные файлы — формально для работы над исходным кодом достаточно и файлов с текстом на DSL, но тогда Visual Studio не сможет правильно построить индекс, и навигацию по исходному тексту осложнится. Генерируемый код однозначно определяется исходным.
4) Автоматизированного доказательства корректности. Этот код не определяет поведение программы, но помогает отсеивать часть заведомо некорректных исходных кодов. К нему относятся, например, модульные тесты.
Это не все классы. Например, выделяют еще
исходный код руководства пользователя и само
руководство пользователя, но они уже иррелевантны тому, что я сейчас хочу сказать. А я сейчас хочу нарушить собственное правило, повторив его, но уже в новом ключе.
Не повторяйся. Если ты распространяешь свой исходный код по принципу "open source", то распространяй только самую необходимую его часть — ту часть, из которой потом можно будет восстановить всё остальное. Например, никогда не распространяй генерируемый и объектный коды.
Замечание 1: По принципу "open source" можно распространять код не всем, а только ограниченному кругу лиц. Например, себе.
Замечание 2: Исходный код и генерируемый часто путают, хотя отличить их друг от друга не сложно: если человек, который будет сопровождать твой код, сможет восстановить
это, имея под рукой остальную часть кода, то
это — генерируемый код. Если
это никак невозможно восстановить, имея все остальное, то
это — исходный код.