я знаю, что на меня вскочат для этого, но я серьезен.
Операторы возврата являются в основном похмельем со дней процедурного программирования. Они - форма goto, наряду с повреждением, продолжают, если, переключатель/случай, в то время как, поскольку, уступают и некоторые другие операторы и эквиваленты на большинстве современных языков программирования.
Операторы возврата эффективно 'GOTO' точка, где функция была вызвана, присвоив переменную в том объеме.
Операторы возврата - то, что я называю 'Удобным Кошмаром'. Они, кажется, добиваются цели быстро, но вызывают обширные головные боли обслуживания по линии.
, Это - самое важное и фундаментальное понятие объектно-ориентированного программирования. Это - смысл существования ООП.
Каждый раз, когда Вы возвращаете что-либо из метода, Вы в основном 'пропускаете' информацию состояния от объекта. Не имеет значения, если Ваше состояние изменилось или нет, ни прибывает ли эта информация из других объектов - это не имеет никакого значения для вызывающей стороны. То, что это делает, позволяют поведению объекта быть за пределами объекта - повреждающаяся инкапсуляция. Это позволяет вызывающей стороне начинать управлять объектом способами, которые приводят к хрупким проектам.
, я рекомендую любому разработчику читать о Закон (Лода) Demeter на c2.com или Википедии. ЛОД является принципами проектирования, которые использовались в местах, которые имеют реальные ограничения программного обеспечения 'для решения ответственных задач' в прямом смысле, как JPL. Это, как показывали, уменьшило сумму ошибок в коде и улучшило гибкость.
Там имеет превосходную аналогию на основе прогулки с собакой. При прогулке с собакой Вы физически не достаете ее участки и перемещаете их таким образом, что собака идет. Вы управляете, чтобы собака шла, и она заботится участки сами по себе. Оператор возврата на этой аналогии эквивалентен собаке, позволяющей Вам доставать ее участки.
, Вы заметите, что ни один из них не требует оператора возврата. Вы могли бы думать, что конструктор является возвратом, и Вы идете к чему-то. На самом деле возврат от средства выделения памяти. Конструктор просто устанавливает то, что находится в памяти. Это в порядке, пока, инкапсуляция которого новый объект в порядке, потому что, когда Вы сделали его, Вы имеете полный контроль над ним - никто еще не может повредить его.
атрибуты Доступа других объектов является правильным. Методы get отсутствуют (но Вы знали, что они уже были плохи, правильно?). Методы set в порядке, но лучше использовать конструкторов. Наследование плохо - когда Вы наследовались другому классу, любые изменения в том классе могут и вероятно повреждать Вас. Сниффинг типа плох (Да - ЛОД подразумевает, что Java/C++, основанная на типе стиля отправка является неправильной - спрашивающий о типе, даже неявно, , повреждающаяся инкапсуляция. Тип является неявным атрибутом объекта. Интерфейсы являются Правильной Вещью).
Итак, почему это - весь проблема? Ну, если Ваша вселенная не очень отличается от моей, Вы тратите много кода отладки времени. Вы не пишете код, который Вы планируете на никогда повторное использование. Ваши требования к программному обеспечению изменяются, и это вызывает внутренние изменения API/интерфейса. Каждый раз, когда Вы использовали оператор возврата, Вы представили очень хитрую зависимость - методы, возвращая что-либо требуются, чтобы знать о том, как независимо от того, что они возвращаются, будет используемым - который является каждым случаем! Как только интерфейс изменяется на одном конце или другом, все может повредиться, и Вы сталкиваетесь с долгим и утомительным поиском на ошибку.
Они действительно - рак в Вашем коде, потому что, как только Вы начинаете использовать их, они способствуют дальнейшему использованию в другом месте (который является, почему можно часто находить цепочки метода возврата среди объектных систем).
Поэтому, какова альтернатива?
С ООП - цель состоит в том, чтобы сказать другие объекты, что сделать, и позволить им заботиться о нем. Таким образом, необходимо забыть процедурные способы сделать вещи. Это легко действительно - просто никогда не пишут операторы возврата. Существуют намного лучшие способы сделать то же самое:
, Если Вам действительно нужен ответ назад - используют вызов назад. Передача в структуре данных, чтобы быть заполненным в, даже. Тем путем Вы содержите интерфейсы в чистоте и открытый для изменения, и Ваша целая система менее хрупка и более адаптируема. Это не замедляет Вашу систему, на самом деле это может ускорить его, таким же образом как оптимизация последнего вызова делает - кроме этого случая, нет никакого последнего вызова, таким образом, Вы не должны даже напрасно тратить время, управляя стеком с возвращаемыми значениями.
, Если Вы следуете за этими аргументами, Вы найдете там, действительно никогда потребность в операторе возврата.
, Если Вы применяете эти методы, я гарантирую, что довольно скоро Вы найдете расходы ошибок поиска намного меньшего количества времени адаптируются к изменениям требования намного более быстро, и имеющий меньше проблем, понимая собственный код.
Мне удалось решить проблему. Смотря на вывод lspci
, lshw
и dmesg
, я в конечном счете решил, что все корневые концентраторы USB обнаруживались, но была проблема с запросами на прерывание, которая препятствовала тому, чтобы некоторые из них работали. Bluetooth, камера, и т.д., перестал работать, потому что они были соединены через один из концентраторов, который не работал.
решение состояло в том, чтобы удалить все экземпляры строки acpi=noirq
от '/boot/grub/grub.cfg'.
Вещи, вероятно, пошли не так, как надо, когда я редактировал конфигурацию личинки несколько месяцев назад, пытаясь устранить отдельную проблему. Я не заметил проблемы сразу же, потому что я не использую рассматриваемые устройства все настолько часто. Благодаря всем, кто не торопился для комментария.