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

Сколько информации нужно вводить в класс? (ООП)

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

Проект (на данный момент) для чтения в XML файле, байт за байтом, сохраняет теги элемента в одном массиве и значения данных в другом. Я сражался с ним на этом (учитывая рамки .net, связанные с XML), но это была проигранная битва. Он хочет, чтобы мы закодировали это, не используя XML-материал .net.

Он представил пример OOP для этой программы, который он набросал (первоначально написанный на Java, портированный на С++, затем перенесенный с С++ на С#)

В своем примере он получил три класса. первый, XMLObject, который содержит массивы, квази-конструктор, методы getter и setter (не свойства, которые я планирую исправить в моей версии), и метод добавления тегов < и > в теги сохраняться в массивах (и при необходимости выводить на консоль).

Второй класс - это класс parseXML. В этом случае у него есть поля, которые отслеживают количество строк, смещение файла, смещение тега и строки для хранения элементов и данных. Опять же, он получил методы getter и setter, несколько методов анализа, которые ищут разные вещи, и общий метод синтаксического анализа, который использует другие методы анализа (вроде их объединяет). Некоторые из этих методов вызывают вызовы методов класса XMLObject и отправляют проанализированные элементы и значения данных в соответствующие их массивы.

Третий класс, который у него есть, - это тот, у которого нет полей, и имеет два метода: один для выполнения ATOI и один для сброса части потока файлов на консоль.

Я знаю, что мы создаем менее эффективную версию того, что уже включено в инфраструктуру .net. Я указал ему на него, и ему сказали: "Не используйте XML-класс .net, конец обсуждения", поэтому пусть все согласятся просто оставить это один.

Мой вопрос в том, должны ли быть действительно 3 отдельных класса. Разве класс разбора не наследуется от класса объектов XML или просто не кодируется в классе объектов XML, и не должны ли методы ATOI и демпинга быть в одном из этих двух классов?

Мне кажется, что если цель синтаксического анализа в жизни состоит в анализе XML файла и хранении элементов и полей данных в массиве, он должен быть в том же классе, а не изолирован и должен делать это через геттеры и сеттеры (или свойства в версии, которую я собираюсь сделать). Я не понимаю, почему массивы должны быть инкапсулированы в сторону от методов анализа, которые фактически дают им, что хранить.

Любая помощь будет оценена, так как я все еще это проектирую и хочу сделать ее по крайней мере как близкую к "правильной" (я знаю ее относительный термин). Форма ООП.

4b9b3361

Ответ 1

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

Во-вторых: его версия не (учитывая тот факт, что это в значительной степени переписывание частей пространства имен System.XML) слишком ужасна. В принципе у вас есть один класс, который "есть" ваш XML. Подумайте об этом как о классах XDocument или XmlDocument: в основном он просто содержит сам Xml. Тогда у вас есть ваш Xml Parser: подумайте об этом, как XmlReader. И ваш последний - своего рода эквивалент XmlWriter.

Помните, что в OOP ваш класс Xml (тот, который представляет сам документ) не должен знать и не заботиться о том, как он попал во владение имеющейся у него информацией. Кроме того, Parser должен знать, как получить Xml, но он не должен заботиться о том, где он хранится. Наконец, ваш класс Writer не должен заботиться о том, откуда поступают данные, только там, где это происходит.

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

Ответ 2

Общее правило состоит в том, что мы подсчитываем размер класса в количестве обязанностей, которые он имеет:

Класс должен иметь один ответственность: единственная причина для изменение.

Мне кажется, что ваш учитель правильно отделил свои обязанности. Он отделил представление от логики синтаксического анализа xml, и он отделил данные xml от поведения анализа XML.

Ответ 3

Некоторые моменты:

  • Классы - существительные; методы - глаголы.
    Ваш класс должен называться XmlParser.

  • Поскольку синтаксический анализатор XML не является частью XMLObject и не расширяет XMLObject, он должен быть отдельным классом.

  • Третий класс не имеет ничего общего ни с одним из двух других; это просто обычный класс Utilities.

  • В целом, каждый класс должен отвечать за единицу работы или хранения.
    Не пытайтесь вкладывать слишком много в один класс (см. Анти-шаблон "Объект Бога" ).
    Нет ничего плохого в том, что у меня много классов. (Пока все имеют смысл)

Ответ 4

Обобщите, что должна делать система:

  • для чтения в XML файле, байт по байту,
  • хранить теги элементов в одном массиве,
  • значения данных для другого.

Я бы, вероятно, нарезал его следующим образом:

  • Reader: заданный путь к файлу, выводит содержимое побайтно (IEnumerable<byte>)
  • Tokenizer: при перечислении байтов выдает токены, относящиеся к XML-контексту (IEnumerable<XmlToken>)
  • XmlToken: базовый класс для любого результата, который производит токенизатор. Пока вам нужны 2 специализации:
    • Тег: открывающий тег
    • Значение: содержимое тега
  • TokenDelegator: принимает токенизатор и экземпляр
  • IXmlTokenVisitor: (см. шаблон посетителя)
  • TagAndValueStore: реализует IXmlTokenVisitor. Visit(Tag tag) и Visit(Value value) являются имплантированными, а соответствующий контент хранится в массивах.

Понимаете, я закончил с 7 классами и 1 интерфейсом. Но вы можете заметить, что вы заложили основы для полноценного анализатора XML.

Часто код, который продается как OO, просто нет. Класс должен придерживаться принципа единой ответственности.