Страницы

Поиск по вопросам

среда, 4 декабря 2019 г.

Низкоуровневый и высокоуровневый классы

#классы


Иногда попадаются (java) такие понятия как "низкоуровневый класс" и/или "высокоуровневый
класс". 

Эти понятия имеют отношение к любому языку программирования оперирующему классами? 

Возможно дать этим понятиям точную характеристику или точное определение?
    


Ответы

Ответ 1



Если говорить о java, то полагаю, что речь идет о классах ввода-вывода. Низкоуровневые классы оперируют низкоуровневыми данными и работают с потоками байтов (например ByteArrayInputStream и FileInputStream), а высокоуровневые — объектами (например ObjectInputStream и BufferedInputStream). Высокоуровневые классы работают на базе низкоуровневых и отличаются по степени абстракции данных. Для примера класс, который читает файл побитово будет низкоуровневым, а класс, который читает его построчно в Unicode — высокоуровневым. А если пойти дальше, то может быть класс, который обращается к файлу сразу как к объекту xml и он будет еще более высокоуровневым по отношению к предыдущему.

Ответ 2



Я обычно такие термины наблюдаю, когда речь идёт про инверсию зависимостей (DiP). Подробно можно почитать тут. Если кратко, то низкоуровневый класс - это класс-рабочий, по сути, который какие-то действия совершает, в то время как высокоуровневый класс управляет этими "рабочими". В DiP посыл в том, что высокоуровневые классs не должны зависеть непосредственно от низкоуровневых классов, а скорее получают объекты этих классов (или фабрик, которые их создают) заинджекченных в них, что выводит зависимость на уровень дженериков/интерфейсов. К примеру, хотим мы выводить на печать символы. Высокоуровневый класс содержит логику по копированию, низкоуровневые: чтение с клавиатуры (KeyboardReader) и вывод на печать (PrinterWriter). Высокоуровневый класс не должен зависеть от конкретной реализации. Ведь мы можем потом захотеть, к примеру, вывод не на принтер, а в файл (FileWriter) и т.п. Если делать плохо, то будет завязка на PrinterWriter и придётся всё переписывать. Если делать правильно, то будет что-то вроде такого: Высокоуровневый класс -> уровень абстракции -> низкоуровневый класс.

Ответ 3



На практике понятие 'высоко' и 'низкоуровневый' чаще применяется к методам, а не к классам. Возможно это связано с тем, что такие понятия не определены в классическом ООП. Но вы правы кое-где такие понятия встречаются и применительно к классам. В java, в официальной документации, понятия низкоуровневый и высокоуровневые классы встречаются только в контексте классов ввода-вывода. Например классы 'ByteArrayOutputStream' и 'FileInputStream' являются низкоуровневыми, а 'PrintStream', 'ObjectOutputStream', 'DataOutputStream' - высокоуровневыми. Также понятия высокоуровневый и низкоуровневые классы используются при описании Принципа Инверсии Зависимостей. В целом, отличие одних классов от других в уровне абстракции. Разделение классов на низко и высокоуровневые классы - условное. На любой высокоуровневый класс можно придумать еще более высокоуровневый(абстрактный) класс и на любой низкоуровневый класс часто можно придумать еще более специфичный класс.

Комментариев нет:

Отправить комментарий