Что подразумевается под «получением правильного уровня абстракции»? - PullRequest
3 голосов
/ 30 октября 2010

Я читал о том, как тяжело в программировании писать код "на правильном уровне абстракции". Хотя абстракция, как правило, скрывает детали за слоем, пишет ли что-то на правильном уровне абстракции, заставляя методологию реализовать решение правильно? Например, если я собираюсь написать класс для представления автомобиля, я предоставлю свойства для колес и т. Д., Но если меня попросят написать класс для автомобиля без колес, я не буду предоставлять колеса и, следовательно, нет способ "водить" машину. Это то, что подразумевается под правильной абстракцией?

Спасибо

Ответы [ 3 ]

10 голосов
/ 30 октября 2010

Не совсем,

Обеспечение правильного уровня абстракции - это знание того, сколько информации с нижних уровней нужно пройти через ваш уровень.

Предположим, вы писали высокоуровневую библиотеку HTTP.Возможно, вы бы предоставили метод Get (), метод Head (), метод Post () и т. Д., Но вам не нужно предоставлять доступ к базовым сокетам, поскольку вы абстрагируете эту деталь от пользователя.

И ниже того Сокета, который вы используете, есть уровни абстракции, с которыми вам не нужно иметь дело.(Вы получаете доступ к абстракции только на один уровень ниже себя, за исключением того, что работа с этим уровнем заключается в том, чтобы иметь дело со слоем под ним и т. Д.)

Например, вам не важен протокол управления потоком в скользящем окне, потому что TCP абстрагирует эти детали.

-
Если вы кодируете слишком высокий уровень абстракциислой для целей, которые вы пытаетесь достичь, вы столкнетесь с несколькими деталями реализации.Когда вы боретесь с библиотекой за контроль, это говорит о том, что, возможно, вы работаете на слишком высоком уровне.

И наоборот, если вы кодируете на слишком низком уровне абстракции, вы потеряетесь в деталях реализации.Возвращаясь к моему примеру HTTP, если вы просто хотите выполнить запрос Get к серверу и внедрили рукопожатие TCP в своем коде, то, возможно, вы либо захотите попробовать использовать библиотеку, либо абстрагировать свой код TCP в библиотеку.и взаимодействовать с ним через это.

-
В одном уроке, который я проводил по этому предмету, у учителя был интересный метод объяснения абстракций.Он заставил нас думать о них просто как о «точке зрения» или «перспективе» на объект или сценарий.

Детали, которые важны с одной точки зрения, совсем не важны с другой точки зрения.

Он поставил книгу на стол и назначил ученикам такие роли, как «Читатель», «Продавец книг», «Автор», «Библиотекарь» или «Грузоотправитель», и спросил нас, какие подробности о книгемы думали, что были важны для нас в этой роли.Исходя из списка, назначенного человеку, его ответы сильно различались.

Это абстракция.Нужны только те детали, которые важны для вас, и позволить всем другим деталям быть обработанными в другом месте (или просто упасть на обочину).

3 голосов
/ 30 октября 2010

Не думаю, что это так.

Для меня абстракция - это синоним обобщения.Чем более абстрактно что-то, тем больше автор пытается думать о проблеме таким образом, чтобы ее было легче расширять и применять к новым проблемам.

В целом, большая абстракция требует больше усилий для разработки иПонимаю.Если вы разработчик, и вам дана очень абстрактная среда для работы, вам придется думать с точки зрения структуры, а не использовать понятия, которые может предложить ваш здравый смысл.

ИтакКак в вашем примере, автомобиль будет иметь очень низкий уровень абстракции.RollingVehicle может быть выше, а Transport может быть самым абстрактным из всех.

Правильный выбор зависит от того, насколько широко вы хотите применять свои классы и насколько легко вы понимаете, что вы хотите, чтобы они были.

1 голос
/ 30 октября 2010

Я думаю, что один опасный аспект абстракции - это способность стирать или скрывать реальность или дизайн, который она представляет.Вы всегда должны соблюдать разумную дистанцию ​​между тем, что вы представляете, и представлением.Под «разумным» я имею в виду, что внешнему разработчику легко понять, как он не программировал этот конкретный проект.

Джоэл Спольски заявил, что совершенно правильно говорить об опасностях «астронавтов архитектуры» :

Когда великие мыслители думают о проблемах, они начинают видеть шаблоны.Они смотрят на проблему людей, посылающих друг другу файлы текстового процессора, а затем они смотрят на проблему людей, посылающих друг другу электронные таблицы, и они понимают, что существует общая закономерность: отправка файлов.Это уже один уровень абстракции.Затем они поднимаются на еще один уровень: люди отправляют файлы, но веб-браузеры также «отправляют» запросы на веб-страницы.И когда вы думаете об этом, вызов метода для объекта подобен отправке сообщения объекту!Это снова то же самое!Это все операции отправки, , поэтому наш умный мыслитель изобрел новую, более высокую, более широкую абстракцию, называемую обмен сообщениями, но теперь она становится действительно расплывчатой, и никто больше не знает, о чем они говорят.Бла .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...