я знаю, что на меня вскочат для этого, но я серьезен.
Операторы возврата являются в основном похмельем со дней процедурного программирования. Они - форма goto, наряду с повреждением, продолжают, если, переключатель/случай, в то время как, поскольку, уступают и некоторые другие операторы и эквиваленты на большинстве современных языков программирования.
Операторы возврата эффективно 'GOTO' точка, где функция была вызвана, присвоив переменную в том объеме.
Операторы возврата - то, что я называю 'Удобным Кошмаром'. Они, кажется, добиваются цели быстро, но вызывают обширные головные боли обслуживания по линии.
, Это - самое важное и фундаментальное понятие объектно-ориентированного программирования. Это - смысл существования ООП.
Каждый раз, когда Вы возвращаете что-либо из метода, Вы в основном 'пропускаете' информацию состояния от объекта. Не имеет значения, если Ваше состояние изменилось или нет, ни прибывает ли эта информация из других объектов - это не имеет никакого значения для вызывающей стороны. То, что это делает, позволяют поведению объекта быть за пределами объекта - повреждающаяся инкапсуляция. Это позволяет вызывающей стороне начинать управлять объектом способами, которые приводят к хрупким проектам.
, я рекомендую любому разработчику читать о Закон (Лода) Demeter на c2.com или Википедии. ЛОД является принципами проектирования, которые использовались в местах, которые имеют реальные ограничения программного обеспечения 'для решения ответственных задач' в прямом смысле, как JPL. Это, как показывали, уменьшило сумму ошибок в коде и улучшило гибкость.
Там имеет превосходную аналогию на основе прогулки с собакой. При прогулке с собакой Вы физически не достаете ее участки и перемещаете их таким образом, что собака идет. Вы управляете, чтобы собака шла, и она заботится участки сами по себе. Оператор возврата на этой аналогии эквивалентен собаке, позволяющей Вам доставать ее участки.
, Вы заметите, что ни один из них не требует оператора возврата. Вы могли бы думать, что конструктор является возвратом, и Вы идете к чему-то. На самом деле возврат от средства выделения памяти. Конструктор просто устанавливает то, что находится в памяти. Это в порядке, пока, инкапсуляция которого новый объект в порядке, потому что, когда Вы сделали его, Вы имеете полный контроль над ним - никто еще не может повредить его.
атрибуты Доступа других объектов является правильным. Методы get отсутствуют (но Вы знали, что они уже были плохи, правильно?). Методы set в порядке, но лучше использовать конструкторов. Наследование плохо - когда Вы наследовались другому классу, любые изменения в том классе могут и вероятно повреждать Вас. Сниффинг типа плох (Да - ЛОД подразумевает, что Java/C++, основанная на типе стиля отправка является неправильной - спрашивающий о типе, даже неявно, , повреждающаяся инкапсуляция. Тип является неявным атрибутом объекта. Интерфейсы являются Правильной Вещью).
Итак, почему это - весь проблема? Ну, если Ваша вселенная не очень отличается от моей, Вы тратите много кода отладки времени. Вы не пишете код, который Вы планируете на никогда повторное использование. Ваши требования к программному обеспечению изменяются, и это вызывает внутренние изменения API/интерфейса. Каждый раз, когда Вы использовали оператор возврата, Вы представили очень хитрую зависимость - методы, возвращая что-либо требуются, чтобы знать о том, как независимо от того, что они возвращаются, будет используемым - который является каждым случаем! Как только интерфейс изменяется на одном конце или другом, все может повредиться, и Вы сталкиваетесь с долгим и утомительным поиском на ошибку.
Они действительно - рак в Вашем коде, потому что, как только Вы начинаете использовать их, они способствуют дальнейшему использованию в другом месте (который является, почему можно часто находить цепочки метода возврата среди объектных систем).
Поэтому, какова альтернатива?
С ООП - цель состоит в том, чтобы сказать другие объекты, что сделать, и позволить им заботиться о нем. Таким образом, необходимо забыть процедурные способы сделать вещи. Это легко действительно - просто никогда не пишут операторы возврата. Существуют намного лучшие способы сделать то же самое:
, Если Вам действительно нужен ответ назад - используют вызов назад. Передача в структуре данных, чтобы быть заполненным в, даже. Тем путем Вы содержите интерфейсы в чистоте и открытый для изменения, и Ваша целая система менее хрупка и более адаптируема. Это не замедляет Вашу систему, на самом деле это может ускорить его, таким же образом как оптимизация последнего вызова делает - кроме этого случая, нет никакого последнего вызова, таким образом, Вы не должны даже напрасно тратить время, управляя стеком с возвращаемыми значениями.
, Если Вы следуете за этими аргументами, Вы найдете там, действительно никогда потребность в операторе возврата.
, Если Вы применяете эти методы, я гарантирую, что довольно скоро Вы найдете расходы ошибок поиска намного меньшего количества времени адаптируются к изменениям требования намного более быстро, и имеющий меньше проблем, понимая собственный код.
В IE8 они сделали поле загрузки файла доступным только для чтения в целях безопасности. См. Сообщение в блоге команды IE :
Исторически, элемент управления загрузкой файлов HTML () был источником значительного числа уязвимостей раскрытия информации. Чтобы решить эти проблемы, в поведение элемента управления были внесены два изменения.
Чтобы заблокировать атаки, которые полагаются на «кражу» нажатий клавиш, чтобы тайно обманом заставить пользователя ввести путь к локальному файлу в элемент управления, поле редактирования Путь к файлу открыто теперь только для чтения. Пользователь должен явно выбрать файл для загрузки с помощью диалогового окна «Обзор файлов».
Кроме того, для параметра URLAction «Включить путь к локальному каталогу при загрузке файлов» установлено значение «Отключить» для зоны Интернета. Это изменение предотвращает утечку потенциально конфиденциальной информации о локальной файловой системе в Интернет. Свойства> Строители . Затем нажмите
Создать ...
, выберитеПрограмма
и нажмитеOK
.Настройте главную вкладку построителя, используя значения:
Name : nmbldr_pre
Location : ${system_path:ksh}
Working Directory: ${build_project}
Arguments : nmbldr -p 2 -t ${build_type} -s jpre
Как говорит VonC, элегантным способом является использование Custom Builder .
В качестве альтернативы (в краткосрочной перспективе) собрать вместе скрипт муравья меньше работы выполнить тяжелую работу и определить внешний построитель , чтобы настроить его на проект. Вы можете обнаружить недостатки внешнего конструктора (например, отсутствие дополнительной поддержки), что означает, что стоит приложить усилия, чтобы сделать это «правильно».
Я могу придумать несколько возможных решений более общей проблемы, когда диапазоны неоднородны и есть «дыры». Самыми простыми из них являются:
floorEntry (ключ)
для поиска. Это должно быть менее затратным по времени (O (поиск в журнале (N)), но более эффективным для использования места. Вот решение с использованием NavigableMaps, которое позволяет «дыры» в отображении.
private static class Range {
public int upper, value;
...
}
NavigableMap<Integer, Range> map = new TreeMap<Integer, Range>();
map.put(0, new Range(3, 0)); // 0..3 => 0
map.put(5, new Range(10, 1)); // 5..10 => 1
map.put(100, new Range(200, 2)); // 100..200 => 2
// To do a lookup for some value in 'key'
Map.Entry<Integer,Range> entry = map.floorEntry(key);
if (entry == null) {
// too small
} else if (key <= entry.getValue().upper) {
return entry.getValue().value;
} else {
// too large or in a hole
}
С другой стороны, если нет 'дырки' решение проще: ProjectPreferences-> C / C ++ Сборка-> BuilderSettings Выберите «Внешний построитель» и введите путь к waf
, например, я использую / Users / mark / bin / waf -v -k -j2
Обратите внимание, что waf и make не согласны с параметром -j, и вы должны указать i явно и не использовать диалоговое окно eclipse.
Вы можете использовать представление Make target добавляет цели для вызова waf, например, configure, build и т. д.
Одна из моих проблем заключалась в том, что Eclipse жестко запрограммирован для просмотра вывода Make say Make при изменении каталога, поэтому мне пришлось исправить waf см. waf issue