![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#111 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
ну значит лучше блок, а в который вложить цикл. так мы достигаем трех вещей, и ограничиваем область для переменной, и выносим её из цикла, и переменная находиться рядом с циклом(причем видно что она только для цикла) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#112 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
Упреждая ваш вопрос, поясню на примере. Но сначала, небольшое лирическое отступление: Что такое исходный код? Это - мысли программиста, в терминах его языка программирования. Если на бумаге записана чача, значит и в голове у программиста тоже была чача. А если в голове у программиста чача, значит он не вполне отдаёт себе отчет в том, что он делает, и чего он хочет сделать. А это в свою очередь означает, что вероятность потенциальных ошибок резко возрастает. Что такое, красивый читабельный код? Это мысль программиста, которую программист сумел четко и однозначно сформулировать. Таким образом, красивый читабельный код обладает следующей характеристикой - он имеет грамотную, четкую структуру. Читая такой код, сторонний программист сразу понимает, о чем думал автор, и чего он добивался. Теперь рассмотрим следующий псевдокод: Код:
Это может получится потому, что сам по себе цикл сильно раздут. То есть, само тело цикла содержит большое количество различных строк-мыслей автора кода. Такой цикл трудно читать, его не видно целиком на мониторе, и поэтому трудно сразу весь охватить мысленным взором, и держать в голове. Это свидетельствует о том, что автор кода не привел свои мысли в порядок. Не сумел сформулировать их четко. Его мысли не обладают четкой структурой. Они не разбиты на самостоятельные логические единицы. Автор кода не использовал принципа "разделяй и властвуй". У него всё в куче, и получилась чача. А теперь вот такой пример: Код:
Вы же, вместо того, что бы пересмотреть собственные мысли у себя в голове, и сделать их более стройными и логичными, что делаете? Маскируете проблему, перенося создание сущности к месту использования. Типа, даже в разбухшем туловище блока читать будит легче. То есть, вот так: Цитата:
Паскалевский стиль программирования, когда все служебные переменные прописываются в начале блока - очень хорош. Он дисциплинирует правильно структурировать собственные мысли в голове. И когда начинаешь перелистывать постоянно туда-сюда, по неволе приходят мысли, что код то уже разбух, и пора бы его раздробить на более мелкие и четкие кусочки. К сожалению, для с++ такой стиль не подходит, потому что на сях всякие константы/ссылки и тп не всегда можно инициализировать заранее. Однако, четкость мыслей, и их структура имеет критическое значение и на паскале, и на с++. И человек, который вместо того, что бы использовать этот крайне полезный признак "близкое использование" - глушит его, обманывает этот признак, создавая сущности прямо по месту использования, якобы у него код не раздут - тем самым гробит читабельность. Просто жгет её напалмом, и оказывает себе медвежью услугу. Последний раз редактировалось _Bers; 26.12.2011 в 08:44. |
||
![]() |
![]() |
![]() |
#113 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
Цитата:
Цитата:
я разношу по функциям лишь повторяющиеся блоки, не более. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|||
![]() |
![]() |
![]() |
#114 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
Цитата:
Во-первых, типы данных я никуда не выношу. Целевые данные подготавливаются перед началом цикла, и живут в блоке, который их создал. Внутри цикла уже ничего не создаётся, и не удаляется. Потому что функция, ориентированная на многократное повторение должна быть максимально быстрой. Она работает со значениями уже существующих данных. И ничего не создаёт, и не удаляет. Во-вторых, я сократил размер блока, за счет дробления его большой задачи на кучку мини-задач. Теперь этот блок влазиет на экран монитора, и его можно целиком охватить мысленным взором. Я разделил монолитный механизм на кучку частей, инкапсулировав внутренности этих частей. Теперь, читающему мой код не нужно думать о том, как работает код. Но по говорящим названиям функций, и комментариям, читатель сразу поймёт, что делает код. Таким образом, читатель абстрагируется от сложности реализации алгоритма, но зато прекрасно понимает, что хотел сделать автор кода. Дальше, если читателю нужно понять, как работает код, он уже смотрит реализацию этих функций-частей механизма. Но при этом, он уже знает, что именно делают эти функции. Понять, как работает код, зная что именно он должен делать всегда намного проще, чем когда ты вообще ничего не знаешь. Можно догадываться о том, какой тут был применен алгоритм, изучая поведение самого кода. А можно просто читать код. Разницу понимаете? В-третьих, Я не пытаюсь уменьшить количество кода. Я лишь изменяю саму его структуру так, что бы его можно было легко читать, и понимать что он делает. |
||
![]() |
![]() |
![]() |
#115 | |
C++
Форумчанин
Регистрация: 27.03.2011
Сообщений: 803
|
![]() Цитата:
Код:
Ищете информацию по C++?
cplusplus.com |
|
![]() |
![]() |
![]() |
#116 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
Цитата:
Использовать манипуляторы в циклах предпочтительнее, ибо они ничего не создают, и не удаляют. И таким образом экономят время на конструкторах/диструкторах. Однако целевые данные, с которыми работают манипуляторы являются частью тех блоков, которые их порождают, а вовсе не самих манипуляторов. Поэтому, ни о каком нарушении инкапсуляции тут речи не идёт. Во-вторых, любая логически целостная единица имеет три состояния: 1. Подготовка. 2. Рабочий цикл. 3. Завершение. О каком нарушении инкапсуляции может идти речь, при подготовке данных перед началом основного действия? Ну или при завершении? Подготовительный этап не имеет право знать, что именно ему следует подготовить? Так что ли? Ещё раз: вместо чара тяжелый объект. Будите иметь нерациональные потери производительности, или все таки по уму подготовите блок к работе? Механизм это не только "рабочий цикл", но и "подготовка", и "завершение". Они так же являются полноценными частями механизма. Если вам так сильно нужно скрыть детали реализации механизма, то к вашим услугам функция, в которую можно вынести и подготовку, и сам цикл, и завершение. Либо классы ООП с их конструкторами/диструкторами. |
||
![]() |
![]() |
![]() |
#117 | |
Пользователь
Регистрация: 19.12.2011
Сообщений: 65
|
![]() Цитата:
Так, к слову. Как можно сделать: while(a<int)? |
|
![]() |
![]() |
![]() |
#118 |
Пользователь
Регистрация: 19.12.2011
Сообщений: 65
|
![]()
Вопрос не по теме, за него преподаватель обещал 5 за зачет. Ответ узнаю через две недели, так что есть только предположение.
Есть три дома и отдельно газ, свет и вода. Нужно провести к каждому дому по три трубы, но так, чтобы они не пересеклись. Размещать элементы можно как угодно. |
![]() |
![]() |
![]() |
#119 | ||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
я лично наоборот ненавижу когда литой код разорван выносами в функции.(особенно когда в них нет необходимости) особенно когда цикл с ветвлением, и проходя мысленно(не знаю как вы, я уже года 4 назад научился выполнять код в голове, медленно читая его) по нему. Цитата:
Цитата:
![]() Цитата:
например тут: Код:
но тут: Код:
но это если функция-цикл(функция по сути состоящая из цикла), для больших функций те же правила, но выносить не во всю функцию, а в блок в который уже помещать функцию. то есть первый пример будет таким: Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||||
![]() |
![]() |
![]() |
#120 | |
C++
Форумчанин
Регистрация: 27.03.2011
Сообщений: 803
|
![]() Цитата:
Ищете информацию по C++?
cplusplus.com |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
PopupMenu со мной не дружит | Жигилий_Ульяна | Компоненты Delphi | 5 | 25.12.2008 11:04 |
проблемы с select или со мной... | smoke888 | JavaScript, Ajax | 2 | 23.09.2008 19:02 |