Подтвердить что ты не робот

Будет ли наследование прерывания инкапсуляции?

Скажем, у меня есть файл CSV, и я создаю класс с именем CsvFile, который продолжается от java.io.File. Этот класс может анализировать CSV файл и возвращать некоторые данные, например, сколько столбцов находится в файле. Он также может использоваться для функций, которые принимают java.io.File в качестве входных данных. Как F ileUtils.copyFile(File from, File to).

Мой коллега полагает, что я слишком много выставляю из наследства. Его идея состоит в том, чтобы обернуть java.io.File, удерживая его в частной собственности, а не наследуя его. Он думает об экспорте всех открытых методов/свойств из инкапсуляции разрывов файлов, но я считаю это полезным, поскольку мы бесплатно получаем все функции в java.io.File.

Как вы думаете?

4b9b3361

Ответ 1

Я бы предпочел согласиться с вашим коллегой: наследование java.util.File будет вызывать методы, которые не применимы к объектам CsvFile, таким как list(), listFiles(), setExecutable() и т.д.

Создание java.util.File свойство за геттером звучит как лучший выбор: оно не выявляет неулокальных операций с пользователями вашего класса и позволяет вам наследовать из базового класса по вашему выбору.

Ответ 2

Я думаю, все зависит от цели класса. Если вы действительно пытаетесь расширить свое поведение, я бы сказал, что это имеет смысл. Если вы не расширяете поведение Файла, а просто создаете объект CSV, тогда инкапсуляция ограничивает его поведение только тем, что он намерен.

Ответ 3

Вы также можете подумать о том, чтобы сделать его более универсальным, чтобы он мог принимать файлы InputStream или Reader, созданные в формате CSV, из самых разных источников, которые не могут (или не могут быть легко) выбрасываться в файловую систему. У вас все еще может быть набор/конструктор java.io.File для удобства.

Ответ 4

На самом деле это отличная дискуссия. Ваш коллега находится на правой стороне истории на этом. В общем случае вопрос о наследовании сводится к отношениям is-a vs. has-a. В общем, более гибко использовать композицию, чем наследование. В вашем случае его близкий звонок. В конце концов файл csv isa. говоря csvfile, - файл даже не звучит правильно. То, что может быть рассмотрено также, состоит в том, чтобы сделать наследование, но не обернуть наследуемый файл, чтобы были открыты только те методы CSV файла, которые вы хотите. Я также рассмотрю некоторые шаблоны проектирования вокруг этого, где вы хотите наследовать от A, но выставляете более ограниченный интерфейс миру. Я почти уверен, что для этого есть шаблон дизайна. просто не могу запомнить имя....

"Либо, или я думаю, что нет, но объединение обоих - это путь. Первое наследование, чтобы колесо не было повторно изобретено, чем шаблоны, которые инкапсулируются так, что колесо служит своей цели".

Ответ 5

Возможно, моя точка зрения слишком либеральная, но... Инкапсуляция и наследование существуют по какой-то причине. (Смотрите "эволюцию" от ассемблеров до языков высокого уровня.) Эта причина - программист. С абстракциями/парадигмами более высокого уровня вы можете написать лучший код. Трюк состоит в том, чтобы определить "лучше", конечно. Для меня это ремонтопригодность, самостоятельная документация и повторное использование кода. Поэтому я бы выбрал инкапсуляцию над наследованием в вашем конкретном случае. Возможно, это немного больше работы, чтобы написать его один раз, но sooooo намного проще поддерживать в будущем. (Предполагая, что этот материал CSV, конечно, является частью более крупного проекта.)

Ответ 6

Подход, упомянутый вашим коллегой, также имеет то преимущество, что ваш API становится очень маленьким, только разоблачая методы, которые вам действительно нужны, - что позволяет понять, как пользователю пользоваться вашим классом (вы можете представить свой публичный API как-то вроде документации).

Ответ 7

Что касается вашего вопроса

Будет ли инкапсуляция разрыва наследования?

Затем, согласно Джошуа Блоху Эффективная Java, наследование всегда прерывает инкапсуляцию:

В отличие от вызова метода наследование нарушает инкапсуляцию [Snyder86]. Другими словами, подкласс зависит от реализации детали его суперкласса для его правильной функции.

Относительно того, следует ли использовать наследование или состав, как уже говорилось, это зависит от того, есть ли ваш CsvFile файл в смысле java.util.File.