- 11. Принципы функционирования систем программирования. Функции текстовых редакторов в системах программирования. Компилятор как составная часть системы программирования.
- 10 базовых принципов программирования
- 1. KISS
- 2. DRY
- 3. Open/Closed
- 4. Принцип единой ответственности
- 6. Разделение интересов
- 7. YAGNI
- 8. Избежание преждевременной оптимизации
- 9. Рефакторинг, рефакторинг и ещё раз рефакторинг
- 10. Чистый код > Умный код
- Что делает программиста эффективным?
11. Принципы функционирования систем программирования. Функции текстовых редакторов в системах программирования. Компилятор как составная часть системы программирования.
Текстовый редактор в системе программирования — это программа, позволяющая создавать, изменять и обрабатывать исходные тексты программ на языках высокого уровня.
В принципе текстовые редакторы появились вне какой-либо связи со средствами разработки. Они решали задачи создания, редактирования, обработки и хранения на внешнем носителе любых текстов, которые не обязательно должны были быть исходными текстами программ на языках высокого уровня. Эти функции многие текстовые редакторы выполняют и по сей день.
Возникновение интегрированных сред разработки на определенном этапе развития средств разработки программного обеспечения позволило непосредственно включить текстовые редакторы в состав этих средств. Первоначально такой подход привел к тому, что пользователь (разработчик исходной программы) работал только в среде текстового редактора, не отрываясь от нее для выполнения компиляции, компоновки, загрузки и запуска программы на выполнение. Для этого
потребовалось создать средства, позволяющие отображать ход всего процесса разработки программы в среде текстового редактора, — такие, например, как метод отображения ошибок в исходной программе, обнаруженных на этапе компиляции, с позиционированием на место в тексте исходной программы, содержащее ошибку.
Можно сказать, что с появлением интегрированных сред разработки ушло в прошлое то время, когда разработчики исходных текстов вынуждены были первоначально готовить тексты программ на бумаге с последующим вводом их в компьютер. Процессы написания текстов и собственно создание программного обеспечения стали единым целым.
Интегрированные среды разработки оказались очень удобным средством. Они стали завоевывать рынок средств разработки программного обеспечения. А с их развитием расширялись и возможности, предоставляемые разработчику в среде текстового редактора. Со временем появились средства пошаговой отладки программ непосредственно по их исходному тексту, объединившие в себе возможности отладчика и редактора исходного текста. Другим примером может служить очень удобное средство, позволяющее графически выделить в исходном тексте программы все лексемы исходного языка по их типам — оно сочетает в себе возможности редактора исходных текстов и лексического анализатора компилятора.
В итоге в современных системах программирования текстовый редактор стал важной составной частью, которая не только позволяет пользователю подготавливать исходные тексты программ, но и выполняет все интерфейсные и сервисные функции, предоставляемые пользователю системой программирования. И хотя современные разработчики по-прежнему могут использовать произвольные средства для подготовки исходных текстов программ, как правило, они все же предпочитают пользоваться именно тем текстовым редактором, который включен в состав данной системы программирования.
Компилятор как составная часть системы программирования
Компиляторы являются, безусловно, основными модулями в составе любой системы программирования. Поэтому не случайно, что они стали одним из главных предметов рассмотрения в данном учебном пособии. Без компилятора никакая система программирования не имеет смысла, а все остальные ее составляющие на самом деле служат лишь целям обеспечения работы компилятора и выполнения им своих функций.
От первых этапов развития систем программирования вплоть до появления интегрированных сред разработки пользователи (разработчики исходных программ) всегда так или иначе имели дело с компилятором. Они непосредственно взаимодействовали с ним как с отдельным программным модулем.
Сейчас, работая с системой программирования, пользователь, как правило, имеет дело только с ее интерфейсной частью, которую обычно представляет текстовый редактор с расширенными функциями. Запуск модуля компилятора и вся его работа происходят автоматически и скрытно от пользователя — разработчик видит только конечные результаты выполнения компилятора. Хотя многие современные системы программирования сохранили прежнюю возможность непосредственного взаимодействия разработчика с компилятором (это и Makefile, и так называемый «интерфейс командной строки»), но пользуется этими средствами только узкий круг профессионалов. Большинство пользователей систем программирования сейчас редко непосредственно сталкиваются с компиляторами.
На самом деле, кроме самого основного компилятора, выполняющего перевод исходного текста на входном языке в язык машинных команд, большинство систем программирования могут содержать в своем составе целый ряд других компиляторов и трансляторов. Так, большинство систем программирования содержат в своем составе и компилятор с языка ассемблера, и компилятор (транслятор) с входного языка описания ресурсов. Все они редко непосредственно взаимодействуют с пользователем.
Тем не менее, работая с любой системой программирования, следует помнить, что основным модулем ее всегда является компилятор. Именно технические характеристики компилятора, прежде всего, влияют на эффективность результирующих программ, порождаемых системой программирования.
Компоновщик. Назначение и функции компоновщика.
10 базовых принципов программирования
Каждый может написать код, скажете вы. А хороший код? Вот здесь начинаются трудности. Мы все слышали эти страшные истории про невероятные цепочки из if-else, программы, которые падают при изменении всего лишь одной переменной, непонятные методы и так далее.
Так бывает при создании продукта, когда за плечами лишь полгода обучения. Не ставьте своей целью написать код, который будет просто работать. Целью должно быть написание кода, который может быть обновлен и изменен – даже если эти изменения будет вносить другой человек. Важно понимать и применять следующие принципы в программировании:
1. KISS
Принцип «простоты» (“keep it simple, stupid” principle) особенно важен для проектов средней сложности. Если вы думаете, что упростили достаточно, упростите код еще на один уровень, но не забывайте начинать с малого, чтобы не создать целую гору проблем.
Когда вы начали писать код, старайтесь делать его максимально простым и читаемым. Написание более сложного кода займет больше времени, а также такой код более подвержен к появлению багов и ошибок, его будет намного сложнее изменить в будущем. Мудрые словах Антуана де Сент-Экзюпери:
«Совершенство достигнуто не тогда, когда нечего добавить, а тогда, когда нечего отнять.»
2. DRY
Принцип „отсутствия повторов” (“don’t repeat yourself” principle) имеет решающее значение при написании чистого и легко изменяемого кода. При написании кода следует избегать дублирования данных и логики. Если вы заметили, что один и тот же фрагмент кода написан снова и снова, принцип был нарушен.
Противоположностью DRY-кода является WET код: «дублируйте». Один из лучших способов диагностики WET-кода – спросить себя: чтобы каким-то образом изменить поведение программы, сколько областей кода нужно было бы изменить?
3. Open/Closed
Код должен быть открытым для внедрения новых областей, но закрытым для изменений, не зависимо от того, пишете вы объекты на Java или модули на Python. Это относится ко всем видам проектов, но этот принцип особенно важен при выпуске библиотек или структур, предназначенных для использования другими пользователями.
4. Принцип единой ответственности
В принципе единой ответственности говорится, что каждый класс или модуль в программе должен заниматься только одним набором конкретных функций.
Классы и модули создаются по этому принципу, но поскольку расширяется функционал, они превращаются с течением времени в классы и модули, которые „могут все” и занимают сотни или даже тысячи строк кода. Если такое произошло, нужно разбить их на более мелкие классы и модули.
6. Разделение интересов
Принцип разделения интересов – это принцип единой ответственности, но на более абстрактном уровне. По сути, программа должна быть спроектирована таким образом, чтобы она имела много разных не перекрывающихся инкапсуляций, и эти инкапсуляции не должны взаимодействовать друг с другом.
Известным примером данного принципа является парадигма model-view-controller (MVC), которая разделяет программу на три различные области: данные («модель»), логика и то, что видит конечный пользователь. Например, код, который обрабатывает загрузку и сохранение данных в базе данных, не должен отвечать за то, как отображать эти данные в Интернете. Данный принцип упрощает техническое обслуживание. И в будущем, если вам когда-нибудь понадобится переписать весь код, вы можете сделать это, не беспокоясь о том, как же данные будут сохранены или как будет обработана логика.
7. YAGNI
Принцип основывается на том, что вам никогда не нужно реализовывать какую-либо функциональность, которая возможно вам понадобится в будущем. Скорее всего, вам это не понадобится, и это будет пустая трата времени, это также усложнит ваш код.
Часто неопытные программисты пытаются написать наиболее абстрактный и общий код, чтобы избежать WET код, но слишком большая абстракция заканчивается тем, что его невозможно поддерживать в будущем. Хитрость заключается в том, чтобы применять принцип DRY только тогда, когда вам нужно.
8. Избежание преждевременной оптимизации
Принцип избежания преждевременной оптимизации не похож на принцип YAGNI. Разница в том, что YAGNI предотвращает внедрение функций до того, как они понадобятся, в то время как принцип избежания преждевременной оптимизации направлен на предотвращение оптимизации работы алгоритмов, прежде чем это будет необходимо.
Проблема с преждевременной оптимизацией заключается в том, что вы никогда не сможете узнать, где будут проблемы в программе до тех пор, пока они не проявятся. Разумеется, вы можете догадаться, и иногда вы даже можете быть правы. Но чаще всего вы будете тратить драгоценное время, пытаясь ускорить процессы, которые не так уж и медленны, как вы думаете.
9. Рефакторинг, рефакторинг и ещё раз рефакторинг
Одна из самых сложных истин для неопытного программиста заключается в том, что очень редко с первого раза все заработает. Вы можете подумать, что написали идеальный код, реализуя определенную функцию, но по мере того, как ваша программа будет усложняться, написание будущих функций может быть довольно сложным, так как вы реализовали определенную функцию на ранней стадии.
Кодовые базы постоянно развиваются. Совершенно нормально пересматривать, переписывать или даже перепроектировать целые фрагменты кода – и это не просто нормально, это правильно. Ведь позже вы будете знать больше о специфике вашего проекта, чем в начале его создания, поэтому вы должны постоянно реорганизовывать свой старый код.
И не откладывайте это место на потом. Как только вы поняли, что где-то есть ошибка, не откладывайте ее исправление. Если вам когда-нибудь понадобится проверить или исправить старый код, постарайтесь улучшить его и сделать более чистым и аккуратным.
10. Чистый код > Умный код
Говоря о чистом коде, оставьте где-то далеко своё этот „умный” код. Под умным кодом подразумевается тип кода, который больше похож на загадку, чем на решение, и существует только для того, чтобы показать, насколько вы умны. На самом деле, никого это не волнует.
Примером „умного кода” будет вместить как можно больше логики в одну строку. Другим примером является использование специфических особенностей языка для написания странных, но работающих операций. Примером умного кода будет все то, что может заставить кого-то сказать «Погоди, что это?» при просмотре вашего кода.
Хороший программист и читаемый код идут рука об руку. Делайте комментарии при такой необходимости. Придерживайтесь определенного стиля, независимо от того, диктуется ли он языком (например, Python) или компанией (например, Google). Наблюдайте за языковыми идиомами и прекратите писать Java-код на Python или наоборот. См. Нашу статью о советах по написанию более чистого кода.
Что делает программиста эффективным?
Спросите пять человек, и вы получите 10 абсолютно разных ответов. Для меня хорошим программистом является тот, кто понимает, что написание кода должно в конечном итоге принести пользу конечному пользователю, с хорошим программистом легко работать в команде, ведь он заканчивает свои проекты со всеми спецификациями вовремя.
Если вы только начинаете, не думайте об этом слишком много. Сосредоточьтесь на том, как писать код без стресса. Если вы чувствуете, что застряли на каком-то участке кода, есть некоторые решения, но с ними вы можете ознакомиться здесь. И если вы просто не довольны своей работой, прочитайте нашу статью о знаках, которые говорят, что программирование – это не ваше.
Если у вас есть мечта стать разработчиком программного обеспечения и вы хотите пройти самый прямой путь к достижению этой цели, определенно стоит пойти на курсы программирования в Минске.