LINUX.ORG.RU

[Java] простой вопрос о структуре программы

 


0

1

Делаю программу - кластерный анализ - на яве. Вкратце, программа читает файл с данными о каких-то объектах (к примеру показатели прибыли, издержек и проч. каких-нибудь компаний за определённый период времени), затем анализирует данные и группирует объекты (в «кластеры»).

Группировка происходит следующим образом: нормализуем переменные, строим матрицу расстояний между объектами по формуле Евклидового расстояния, и затем определёнными алгоритмами:

Одиночная линковка

  • Полная линковка
  • Средняя линковка
  • ну и т.д..

шаг за шагом объединяем объекты в группы по сходству и различию, рисуем диаграмму.

Мне, как начинающему, не понятно как правильнее и лучше реализовать перечисленные алгоритмы. В интерфейсах? или для каждого алгоритма создавать класс? или как лучше? Т.е. надо чтоб в алгоритм опускалась матрица, а он мне выдавал данные для рисования диаграммы.


Мне, как начинающему, не понятно как правильнее и лучше реализовать перечисленные алгоритмы.

Блок-схемой. Иначе заболеешь ЖГМ.

baverman ★★★
()

Мне, как начинающему, не понятно как правильнее и лучше реализовать перечисленные алгоритмы. В интерфейсах? или для каждого алгоритма создавать класс? или как лучше?

я использую следующие правила:
1) определяю перечень фич, подлежащих реализации
2) определяю перечень инструментов, которые имплементят фичи
3) далее просто, 1 инструмент = 1 класс

если класс получается слишком большой, значит фичи неправильно раскиданы, думаем, перераскидываем, и снова в бой

иногда имеет смысл упрощать: 1 фича = 1 класс

фичи, например: чтение из файла, кластеризация, построение диаграммы, отображение диаграммы, etc.

shty ★★★★★
()
Ответ на: комментарий от Sonsee

Я серьезно, вместо того, чтобы набить рабочий код для совершенно плёвой задачки ты хочешь заинженерить её в минимум ста сущностях.

Рефакторинг в жабе безумно дешев, поэтому просто пиши, вылизать и причесать всегда успеешь.

baverman ★★★
()
Ответ на: комментарий от baverman

Я серьезно, вместо того, чтобы набить рабочий код для совершенно плёвой задачки ты хочешь заинженерить её в минимум ста сущностях.

Рефакторинг в жабе безумно дешев, поэтому просто пиши, вылизать и причесать всегда успеешь.

если я буду «просто писать» или «как хочу», мне практикант не зачтёт практику :)

Sonsee
() автор топика
Ответ на: комментарий от shty

интерфейсы имеет смысл использовать в тот момент, когда почувствуешь потребность в них

пишу же, - начинающий.
не затруднит привести несколько примеров, когда есть в них потребность?

Sonsee
() автор топика
Ответ на: комментарий от shty

я использую следующие правила: 1) определяю перечень фич, подлежащих реализации 2) определяю перечень инструментов, которые имплементят фичи 3) далее просто, 1 инструмент = 1 класс

если класс получается слишком большой, значит фичи неправильно раскиданы, думаем, перераскидываем, и снова в бой

иногда имеет смысл упрощать: 1 фича = 1 класс

фичи, например: чтение из файла, кластеризация, построение диаграммы, отображение диаграммы, etc.

btw, спасибо за это :) я в принципе так и делаю.

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

мне практикант не зачтёт практику :)

Так бы сразу и сказал, что надо придумать максимально запутанный дизайн.

Тогда всё просто: каждый метод должен реализовывать собственный интерфейс. Обязательно должен быть свой синглтон под каждый параметр конфигурации. Воткни еще куда-нибудь сигналы/события (нам же надо развязать модули системы?) и последует незамедлительный профит.

baverman ★★★
()
Ответ на: комментарий от Sonsee

не затруднит привести несколько примеров, когда есть в них потребность?

с точки зрения языка лучше почитать вот этот материал, там довольно таки обстоятельно расписано

с точки зрения архитектуры, можно почитать, например, вот этот материал (есть примеры на Java)

shty ★★★★★
()
Ответ на: комментарий от shty

с точки зрения архитектуры, можно почитать, например, вот этот материал (есть примеры на Java)

вот это надо было

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

>если я буду «просто писать» или «как хочу», мне практикант не зачтёт практику :)

Важно, чтобы работало, а не то, КАК написано. ИМХО.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Важно, чтобы работало, а не то, КАК написано. ИМХО.

ну у нас «работает» это ещё даже не тройка ;)
2 с плюсом где-то.

Sonsee
() автор топика
Ответ на: комментарий от Zhbert

Значит ваш препод идиот.

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

Sonsee
() автор топика

можете посмотреть как кластеринг организован в Apache Mahout - там разделено на алгоритмы для определения similarity/distance, и алгоритмы самой кластеризации

ott ★★★★★
()
Ответ на: комментарий от ott

Apache Mahout

спасибо большое, прям то что нужно.

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

не затруднит привести несколько примеров, когда есть в них потребность?

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

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

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

читай - «три алгоритма, одна матрица == делай интерфейсы»
я правильно понял?

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

я правильно понял?

насколько я могу судить по постановке задачи - да. это противоестественно, но именно так делается execution in the kingdom of nouns

jtootf ★★★★★
()

Шаг первый: GOD-object.

Сделай один класс, который реализует все. Каждая подзадача - свой метод.

Шаг второй: рефакторинг:

1. Устрани дублирование
2. Разбей длинные методы на логически связанные куски.
3. Сгруппируй методы, решающие схожие задачи. Из каждой группы методов создай свой класс.
4. Дальше сам. Сиди и вчитывайся в свой код, ищи способы его упростить и сделать более логичным. Обязательно делай перерывы. Не делай что-то, что не имеет какого-то предназначения (интерфейсы для красоты или на будущее, только если есть классы с похожими сигнатурами). Помни: код прекрасен когда из него нечего выкинуть, а не нечего добавить.

Когда получишь опыт, сможешь представлять большие куски кода в голове и делать его рефакторинг до написания. Это назвается проектировать. Пока у тебя нету опыта, научить тебя проектировать невозможно.

dizza ★★★★★
()
Ответ на: комментарий от Zhbert

> Важно, чтобы работало, а не то, КАК написано

Жизненный цикл большинства продуктов не заканчивается на выпуске первой версии. Дальше продукт надо сопровождать, модифицировать, расширять и т.д. И вот тут вам все аукнется...

anonymous
()
Ответ на: комментарий от Sonsee

> не затруднит привести несколько примеров, когда есть в них потребность?

Есть такая книжка: Приёмы объектно-ориентированного программирования. Гамма, Хелм, Джонсон, Влиссидес.

Там это расписано довольно таки неплохо.

Norgat ★★★★★
()
Ответ на: комментарий от baverman

> Вы что-то имеете против практичного подхода?

Да. ООП - это взаимодействие объектов, а не «кусков кода». И писать вещи вроде: «представлять большие куски кода в голове и делать его рефакторинг до написания», - это провокация к закладыванию изначально неверного понимания сути ООП. Молчу уже про перл «проектирование = рефакторинг-в-уме».

LORd
()
Ответ на: комментарий от LORd

ООП - это взаимодействие объектов

Вы это не от большого опыта говорите. В java, ООП, как взаимодействия объектов нет.

Молчу уже про перл «проектирование = рефакторинг-в-уме».

Тут я с dizza полностью согласен, проектирую точно так же: личинка кода рефакторится в уме с периодическим выбросом в редактор, когда в мозгах уже не умещается, тестами доводится до ума и потом опять в голову на следующую итерацию.

baverman ★★★
()
Ответ на: комментарий от baverman

> В java, ООП, как взаимодействия объектов нет.

А что же тогда такое «ООП в java» по Вашему?

Личинка кода рефакторится в уме с периодическим выбросом в редактор, когда в мозгах уже не умещается, тестами доводится до ума и потом опять в голову на следующую итерацию.

Я думаю, Вы путаете понятия «рефакторинг» и «проектирование».

LORd
()
Ответ на: комментарий от LORd

А что же тогда такое «ООП в java» по Вашему?

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

Я думаю, Вы путаете понятия «рефакторинг» и «проектирование».

А ты придаешь этому слишком большое значение. Цель всегда одна — сделать поддерживаемое, гибкое, масштабируемое решение, да подешевле. Как ты этот процесс не назови, суть одна: надо думать, надо писать и кромсать код.

baverman ★★★
()
Ответ на: комментарий от Sonsee

1. Сделать что-то, чтобы работало («работало» = «проверяемо набором юнит-тестов»)
2. Зарефакторить до красивой структуры классов интерфейсов. Непрерывно тестируя тестами из №1.

Ни в коем случае не показывать преподу результат №1.

svu ★★★★★
()
Ответ на: комментарий от baverman

> а «взаимодействие объектов» сюда никак не входит.
Мне страшно подумать о том, как выглядит по-Вашему «взаимодействие объектов».

svu ★★★★★
()
Ответ на: комментарий от svu

Мне страшно подумать о том, как выглядит по-Вашему «взаимодействие объектов».

Это хороший страх, обоснованный, ведь я люблю крякающих драконов.

baverman ★★★
()
Ответ на: комментарий от LORd

А что же тогда такое «ООП в java» по Вашему?

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

Дисклаймер: я такой подход не разделяю, так как у меня DDD головного мозга.

dizza ★★★★★
()
Ответ на: комментарий от dizza

> Почитай про EJB, доки по Spring и поймешь

что ну её нахер, эту яву!

Для лабы по кластерному анализу просто ппц как требуются ежыбэ бины и ынтырпразй-конейнер с иксиэмыль кофнигом!


По теме, ТСу:

Создай четыре метода: читающий данные, нормализующий матрицу, строящий дерево, выводящий результат.

Каждый из методов дорабатывать по-вкусу. Скажем, дерево можно строить из inner class'ов. Для твоей студентческой лабы этого более чем достаточно.

Херотень про интерфейсы и прочий маразматический ынтырпрайз можешь смело забыть.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Херотень про интерфейсы и прочий маразматический ынтырпрайз можешь смело забыть.

Читай выше, ему надо не задачу на кластерный анализ сделать, а как раз навертеть интерфейсов.

baverman ★★★
()
Ответ на: комментарий от dizza

я такой подход не разделяю, так как у меня DDD головного мозга.

Разве DDD имеет какое-то отношение к конкретной реализации?

baverman ★★★
()
Ответ на: комментарий от LamerOk

Для лабы по кластерному анализу просто ппц как требуются ежыбэ бины и ынтырпразй-конейнер

А я это и не советовал. Просто пытался разъяснить человеку что есть жавское ООП. И как бы смысл не в интерпрайз иксемель конфиге. Смысл в разделении логики (основной) и данных. И опять же я не говорю что это 100% хорошо, просто так принято в мире.

dizza ★★★★★
()
Ответ на: комментарий от baverman

Разве DDD имеет какое-то отношение к конкретной реализации?

Я EJB со спрингами привел не в качестве примеров реализаций. Ведь это не только набор конкретный технологий, но и набор рекомендаций по проектированию. Да, никто не запрещает плюнуть на эти рекомендации и с их помощью делать DDD.

dizza ★★★★★
()
Ответ на: комментарий от baverman

> ему надо не задачу на кластерный анализ сделать, а как раз навертеть интерфейсов.

Я в это, откровенно говоря, слабо верю. Просто препрод не принимает хоть и работающее, но откровенное говно.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Херотень про интерфейсы и прочий маразматический ынтырпрайз можешь смело забыть.

ну изначальная идея про интерфейсы исходила как раз от практиканта, я хотел сделать просто классы.

Sonsee
() автор топика
Ответ на: комментарий от svu

1. Сделать что-то, чтобы работало («работало» = «проверяемо набором юнит-тестов») 2. Зарефакторить до красивой структуры классов интерфейсов. Непрерывно тестируя тестами из №1.

Ни в коем случае не показывать преподу результат №1.

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

Sonsee
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.