Написать систему, состоящую из 2 больших частей. Первая часть - это кластер серверов. Класс Cluster должен содержать в
себе несколько Server-ов(реализация - на ваше усмотрение, вы должны продумать архитектуру, массив Server[] или же
Collection<Server> подойдет, можно даже просто захардкодить несколько серверов внутри - главное, чтоб это все лаконично
сочеталось). Каждый Server должен содержать в себе несколько Node объектов (по тому же принципу что и Server). Помимо этого,
каждый Server и Node должны иметь поле number и все должны быть пронумерованы, например, сервер с номером 1, в нем три ноды
с номерами 1, 2, 3, сервер с номером 2 и в нем пять нод с номерами 1, 2, 3, 4, 5 соответственно и т.д.
Дополнительно, у класса Cluster должно быть 2 метода:
public void sendMessage()
public void isFailed(int serverNumber, int nodeNumber)
- sendMessage - должен случайно выбрать ноду на случайном сервере и пометить ее как failed. Все последующие ноды после
нее, также должны быть помечены, как failed.
- isFailed - принимает номер сервера и номер ноды и возвращает ее статус failed - true или false.
Вторая часть - это класс FailSearchEngine, который содержит в себе ссылку на Cluster и использует метод isFailed для поиска
ноды, на которой случилась ошибка. FailSearchEngine должен находить ошибочную ноду наиболее эффективным способом и
выводить на экран номер сервера и этой ноды.
Mr. Mister
18 уровень
помогите решить задачу, у меня совсем нет идей
Комментарии (39)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
23 июля 2019, 14:46
Как успехи, хвастайся.
Суть задачки до меня дошла уже потом, здесь легкий напряг относительно самостоятельного создания классов (на джава раше все это было 100 раз, просто часто за нас писали или составляли пошаговую инструкцию) и небольшое прикосновение к алгоритмам поиска в части "должен находить ошибочную ноду наиболее эффективным способом ". Хотя все на усмотрение решающего.
0
Mr. Mister Java Developer в Playtika
23 июля 2019, 15:02
До меня ничего так и не дошло, сижу целый день думаю. На джава раше, как-то все интуитивно понятно было, всё разжёвано, и Я понимал, что и как от меня требуется.. Тут же, когда все нужно самостоятельно написать Я упал в ступор.. С алгоритмом проблем нет, Я такой уже писал несколько раз, один из них при приёме на курсы, на экзамене. А как построить архитектуру этих серверов и нод Я не въехал. Сейчас приложу, что Я сделал... Но...
0
Mr. Mister Java Developer в Playtika
23 июля 2019, 15:03
0
Justinian Judge в Mega City One Master
23 июля 2019, 15:46
есть сайт codeshare.io можешь сбросить туда все классы и ссылку бросить.
Комментарии бросай писать! Для кого это ты пишешь. Это твой код, ты должен сам понимать что в нем происходит, другие не глупые - тоже поймут. +старайся писать так чтобы поняли.
Имя node3 для списка Нод не самое удачное, nods3 или nodeList3, чтобы было видно что их там несколько.
На джава раше будут большие задачи, будут задания написать с нуля, но после 20-го уровня, а до этого да, много чего разжевано, чтобы смягчить.
Но эта задача 8-9-го уровня первого квеста, все что тебе нужно лишь не испугаться условий и реализовать так, как сказано. Создать пару классов, пару коллекций, присвоить пару значений паре объектов. Ты все это можешь и умеешь.
Сбрось все классы как я писал выше, и брось ссылку, отталкиваться нужно прежде всего от архитектуры всей программы, а потом уже переходить к конкретным методам.
0
Mr. Mister Java Developer в Playtika
23 июля 2019, 16:36
ссылка на весь код.
https://codeshare.io/G6n3WY
0
Justinian Judge в Mega City One Master
23 июля 2019, 16:59
Это уже можно говорить.
По условиям задачи у нас есть кластер серверов. В кластере есть сервера. В сервере есть ноды. Нода может быть зафейлена или нет.
1. Поле isFailed у класса Cluster отображает, зафейлился ли весь Кластер со всеми серверами и нодами? Что оно показывает?
2.
Чем ты руководствовался когда решил наследовать? Какие у тебя идеи насчет этого?
Наследование это IS-A связь.
wolf extends Animal
Волк это животное.
Нода это Сервер?
Сервер это Кластер?
Зачем тебе наследование, какие методы/поля суперкласса ты решил использовать для наследников?
Не нужно выдумывать что-то ради чего-то, слышал что есть наследование, значит нужно обязательно куда-то наследование всунуть.
Пиши как ты понимаешь. Нужно будет - потом всегда добавишь.
3. Напиши мини-ТЗ. Я обычно рисую на бумаге, но можно и списком обычным.
Представь что ты джава тимлид. А я твой стажер. Напиши мне техзадание джаварша-стайл, 3.1. какие классы нужно создать ,
3.2 какие основные поля/методы должны там быть .
Потому что создание серверов в методе мейн это хорошо, но как ты будешь получать к ним доступ с метода findNode в классе FailSearchEngine?
Мое предложение ты не учитываешь (Сделай классы Server, Node, Claster, в классе Сlaster будет поле servers - коллекция/массив объектов типа Server.
в Сервере будет поле, массив/коллекция объектов типа Node.) но альтернативы рабочей у тебя не вижу.
0
Mr. Mister Java Developer в Playtika
23 июля 2019, 17:16
У тебе нет ссылки, где Я могу прочитать об этом? Как это правильно делается, ибо Я перечитывал уже статьи на джавараше, читал Шилдта и философию джава, но как-то не нашёл там искомого, ну или не понял, что нашёл.
0
Justinian Judge в Mega City One Master
23 июля 2019, 17:30
Ты все это читал, просто нужно чтобы все сложилось. Как правильно делается это даже мидлы и не каждый синиор знает ) Твоя задача, сделать как сделается.
Теорию ты будешь закрывать отдельно книжками и курсами.
А здесь время практики, фокусируйся на задаче.
Двигайся от одного пункта ко второму. Я тебе задал три вопроса, жду ответа, не убегай в поля, профессия программист это профессия не знать и в условиях незнания формировать ориентиры по которым идти, шаг за шагом.
0
Mr. Mister Java Developer в Playtika
23 июля 2019, 17:54
По первым двум вопросам не буду отвечать, так как осознал ошибочность своих действий, пошёл вообще не в ту степь.
По пункту 3, постараюсь.
1.Создать 4-ре класа Cluster, Server, Node, FileSearchEngine.
2. в класе Cluster создать поле ArrayList<Server> servers = new ArrayList();
2.1 Создать два метода sendMessage(); isFailed(); (реализация позже)
3. В класе Server создать поля ArrayList<Node> nodes1/2/3= new ArrayList();
3.1 Cоздать поле bolean IsFailed;
3.2 Создать поле int serverNumber;
4. В класе Node создать объекты Node для каждого сервера...
4.1 Cоздать поле bolean IsFailed;
4.2 Создать поле int nodeNumber;
Как-то так, для начала...
0
Justinian Judge в Mega City One Master
23 июля 2019, 18:24
Ок. Запомни это хорошенько.
Получил задачу. Свел ее на листочке к конкретным действиям (создать класс А, Б с методом В и полем С) и пошел пошагово выполнять. Всегда разбивай на шаги и иди от одного ко второму.
Мои новые вопросы.
1 вопрос. Отношения Кластер-Сервер похожи на Сервер-Нода, правильно?
1 кластер содержит много серверов (они в соответствующем поле серверс)
1 сервер содержит много нод.
Почему в кластере 1 поле (серверс) а в классе Сервер сразу три поля с нодами?
Класс Сервер это макет для конкретного экземпляра - объекта.
Один объект - один сервер - одно поле с нодами.
Другой объект - другой сервер - одно поле с нодами.
2 вопрос. В классе сервер поле bolean IsFailed;, я не совсем понял из задания, при каких условиях Сервер считается зафейленым?
Если речь о том, что у него Ноды, половина может быть рабочих, половина зафейленых.
В каком месте условий задачи ты понял что Сервер может иметь статус isFailed?
Может и нужно, но я в условиях это не увидел.
3. ты не указал поля и методы класса FailedSeaechEngine, там один метод, одно поле.
Учти это все, и реализуй по этой схеме, создай костяк по этому ТЗ, методы без реализации, если метод должен что-то вернуть, ставь заглушки return 1; return true к примеру, лишь бы компилилось.
4. Также думаю нужен отдельный класс для запуска, чтобы не мешать все в кучу, хотя можно использовать и метод main класса Кластер, пока что это не принципиально.
Сделаешь, обнови код по ссылке выше (codeshare.io).
Далее тебе нужно будет реализовать метод main где ты его создашь, и там собственно создать инстанс Кластера, создать сервера, и в каждом сервере ноды, думаю хотя бы 5 штук нод,а то что там искать на три ноды..
Ну и отпишись как будут вопросы или сделаешь.
0
Mr. Mister Java Developer в Playtika
24 июля 2019, 05:42
https://codeshare.io/5Zv4be
Вот, вроде разобрался... Осталось реализовать клас поиска...
Посмотри, правильно ли Я сделал...
По-моему тесту, вроде, всё функционирует.
И спасибо огромное, что уделил мне своё время и протянул руку помощи..
0
Justinian Judge в Mega City One Master
24 июля 2019, 10:56
+/- так, видишь - все посильно.
1. В условиях сказано
почему не реализовал случайность? Специально или оставил на потом?
2. Сам метод sendMessage перегружен. У тебя есть номер случайного сервера, номер случайной ноды. Все что тебе нужно это пометить эту ноду на конкретном сервере isFailed и все последующие. То есть не нужно по всем серверам проходиться, номер сервера у тебя есть и номер стартовой для фейлинга ноды, обычный одинарный цикл. Где стартовое i в цикле это рандомный номер ноды.
3.
так не пиши никогда. for/while/if/else if/else пишем всегда с фигурными скобками, обрати на это внимание.
такие места убирай, я понимаю что это черновик, но тем не менее.
4.
сама идея тебе подсветит что можно так:
isFailed само по себе true или false.
5.
ты понимаешь что делает эта строка? В выражении ты присваиваешь isFailed false, оно вернет FALSE (поскольку isFailed станет false) условие не выполнится, а значит всегда будет выполнятся return true.
Из этого важный вывод - мы поломали ноду не там где должны и случайно. А значит поля Ноды и Сервера можно сделать приватными, и при необходимости - пользоваться геттерами/сеттерами.
0
Justinian Judge в Mega City One Master
24 июля 2019, 11:01
препод должен оценить, потому что все с модификаторами паблик делать и без геттеров сеттеров - это обычно много о чем говорит.
Геттеры и сеттеры не нужны обязательны прям для всего - подумай чем ты будешь пользоваться, что нужно по логике программы и тд. Но все пабликами не вариант.
У тебя случайно получился отличный пример почему это плохо и зачем нужна инкапсуляция.
Хотел просто проверить статус Ноды, один знак недописал, и нода зафейлилась. А из-за этого кстати слетит и логика программы в целом, ведь метод отработает , а остальные ноды не будут зафейлены на сервере, но это уже разговоры из "кабы".
0
Mr. Mister Java Developer в Playtika
24 июля 2019, 12:09
1. Случайность в конце, пока для теста, чтобы знать какая нода сломана.
2. Мне нужно фейлить все последующие ноды, тоесть если на первом серве первая нода фейл, то и в этом и на последующих сервах ноды должны быть зафейлены, поэтому по всех серверахх прохожусь циклом.
3. Понял.
4.Идея светит, но Я для себя оставил, что бы пока явно видеть, что к чему.
5. Спасибо незаметил, надо == сравнение сделать, а не присваивание.. опечатка.
Спасибо, что напомнил о геттерах и сэттэрах, сделаю. Сделать, наврное, сервер и нод намбер приватом.
А вот с поиском пока немогу логику правильно прописать, но ещё есть немного времени.
0
Justinian Judge в Mega City One Master
24 июля 2019, 12:32
1. Случайность реализовать это дело пары строк, прежде чем писать алгоритм поиска, нужно реализовать этот пункт, иначе как тестить? Алгоритм должен тестится на случайных нодах, а не на одной и той же.
2.
это уже вольное трактование условий,
лично я оснований для такого не увидел. Не говорю что ты не прав, но чисто по логике, каждый сервер это структурная единица со своим айпишником, точками входа выхода и тд. Да, они объединяются в кластер, но это же не гирлянда, чтобы им последовательно быть включеными.
На каждом сервере есть группа нод. На сервере 3 фейлится третья нода. С какой кстати должна зафейлится нода 1 на сервере 5?
Это разные классы, разные структуры данных, разные коллекции.
Это моя логика, написанно в условии двузначно конечно, но думаю имелось ввиду в пределах одного сервера. Либо пусть условия более полно пишут.
3. Не оставляй "для себя", это учебная задача, но ты должен учиться читать код. А что будет на реальном проекте, когда там еще 100500 технологий сверху будет? А ты привык к сравнению булеан через == true, глаза будут разбегаться. О том что это лишняя дополнительная операция и молчу.
Это тот случай когда нужно делать как правильно, а не как комфортно, и привыкать к этому.
Так что, есть поле isFailed, сравнение должно быть if (isFailed).
Ты много умеешь,много знаешь, отобрази это в коде, покажи другим, покажи себе.
4. Поля servers класса Кластер и nodes класса Сервер тоже думаю можно через геттер сеттер.
А так вроде все, остался один класс с одним методом и одним полем. 0
Mr. Mister Java Developer в Playtika
24 июля 2019, 12:38
Спасибо за советы.
Во 2 пункте уверен, что нужно зафейлить все последующие ноды, это уточнялось устно.
Буду играться с реализацией последнего метода и бинарным поиском.
0
Justinian Judge в Mega City One Master
24 июля 2019, 12:40
то есть звучало именно слово "на остальных серверах зафейлены"- "на остальных серверах все ноды должны быть зафейлены"?
0
Mr. Mister Java Developer в Playtika
24 июля 2019, 12:43
Не остальных, а следующих..
Тоесть. Сервер 2, нода 2 - фейл. Значит Сервер 2, нода 3 - фейл, Сервер 3, все ноды - фейл и тд.
0
Justinian Judge в Mega City One Master
24 июля 2019, 12:49
то понятно, меня интересует слово сервер, ну если звучало, гирлянда так гирлянда.
Да, получается бинарный поиск , у нас ведь отсортированные последовательности.
0
Mr. Mister Java Developer в Playtika
24 июля 2019, 13:05
ага. Только тут 3 сервера, например. Если Я правильно понимаю, то мы должны отдельно каждный масив нод, тобишь сервер, делить, тоесть nodeList.size(); проходиться по нему, потом по следующему и тд.. Ибо просто с одним масивом Я такое проделывал, а когда тут их несколько Я не понимаю как именно Я должен это делать.
0
Justinian Judge в Mega City One Master
24 июля 2019, 13:23
по разному можно.
Посмотри алгоритм бинарного поиска, он очень простой. Делит на два, и в зависимости от результата идет либо в левую половину, либо в правую.
У тебя просто два уровня, массив серверов.
и массив нод.
Фактически получается тебе нужно при помощи бинарного поиска найти нужный сервер.
каждый сервер либо содержит зафейленную ноду либо нет, это тоже отсортированная последовательность получается, ведь не может такого быть что 1 сервер зафейленый, а 3 нет.
Для одного сервера - один вызов метода cluster.isFailed достаточно, думаю понятно отчего.
Найдя сервер, у тебя будет одна коллекция нод.
Там бинарным поиском уже ищешь номер первой зафейленной ноды.
То есть ты не работаешь с несколькими массивами.
Ты работаешь с одним.
Просто сначала серверов.
А потом уже конкретным массивом нод нужного сервера.
Сначала сделай это с дублированием кода, но по хорошему в один алгоритм бинарного поиска, который просто несколько раз можно использовать нужно.
0
Mr. Mister Java Developer в Playtika
24 июля 2019, 13:47
Вроде может, например 1, 2, 3 сервер без зафейленых нод, а в 4-ом сервере есть. И может быть 2 фейл, два нет.. всё зависит от зафейленой ноды первой, где она будет.
0
Justinian Judge в Mega City One Master
24 июля 2019, 14:23
Я имел ввиду порядковый номер.
0
Mr. Mister Java Developer в Playtika
24 июля 2019, 14:49
Ещё вопрос, почему метод не видит, всё то, что есть в масивах? И каким образом сделать так, что бы он оперировал этими данными?
Вывод на экран для примера. Получаеться ошибка OutOfBound
0
Justinian Judge в Mega City One Master
24 июля 2019, 14:53
Ты создаешь новый объект Кластер. Который пустой насколько я помню должен быть.
А в условиях у тебя указано. Что этот класс, FailSearchEngine содержит поле, в котором есть ссылка.
Ссылка на уже существующий кластер где-то.
Ее по разному можно передавать - получать.
Я бы через конструктор передавал, может еще как-то.
Но создавать новый не вариант.
Ты запускаешь класс "ИскатьБанковскуюКарточку", а он создает новый банк..и там ищет. Эт неправильно
0
Mr. Mister Java Developer в Playtika
24 июля 2019, 14:55
Понял, спасибо.
0
Mr. Mister Java Developer в Playtika
24 июля 2019, 15:17
Сделал, всё работает, теперь буду делать её более правильной по твоим советам.
Ещё раз спасибо огромное за потраченное время.
0
Justinian Judge в Mega City One Master
24 июля 2019, 15:27
Та не за что:) Видишь, все ты можешь и умеешь, двигайся дальше.
А задачка мне понравилась, полезная учебная задачка . Я тоже решил сделать, добавил методам сообщения для фана) Успехов
+1
Mr. Mister Java Developer в Playtika
24 июля 2019, 15:38
Креативно ;)
Даже графика есть, круто.
+1
Mr. Mister Java Developer в Playtika
25 июля 2019, 05:58
https://github.com/Stranger09/Playtika-Task-1
Вот, заделал с гэттэрами, сэттэрами с рандомом.
Немного твоей идеи с хакингом украл ;)
+1
Justinian Judge в Mega City One Master
25 июля 2019, 07:19
Прикольно, красавчик )
Но ты ж понимаешь ))) на будущее:
1. Геттер и сеттер для булеан полей:
public void setFailed(boolean isFailed) {
this.isFailed = failed;
}
public boolean isFailed() {
return isFailed;
}
Геттер у тебя как нужно, а сеттеры для булеан полей называются isFailed()
Правда я глянул, что булеан переменная тогда failed должна , но это уже такое )
В любом случае, условие
if (node.isFailed)
читается лучше чем
if (node.getFailed)
2.
Cluster search;
FailSearchEngine(Cluster search) {
this.search = search;
}
Имя поля должно быть cluster.
Cluster это кластер серверов.
Кластер это не поиск.
Имя переменной раскрывает ее суть, но кластер ничего не знает про наш поиск.
Поэтому обычно пишут так. Тип (имя класса) и имя класса совпадает.
Claster cluster;
FailSearchEngine(Cluster cluster) {
this.cluster = cluster;
}
Ну вроде уже точно все. :)
Успехов!
+1
Justinian Judge в Mega City One Master
22 июля 2019, 14:59
Где задачку взял?
Не совсем понятно что хотят, смущает:
Как я понял, здесь два уровня сложности как можно решать.
Если чисто ООП, где сервер это просто абстракция воплощенная в конкретном классе/объекте, то подозрительно слишком просто получается, о каких "больших кусках" говорится..
Второй уровень, реальные объекты, которые могут выступать в виде серверов и использующие сетевое общение, это уже чуть сложнее, но в условиях про это ничего, да и метод sendMessage у Кластера, задача которого фейлить ноды...
Наверное все-таки первый вариант.
У кого какие мысли, делитесь, не молчите :) 0
Mr. Mister Java Developer в Playtika
22 июля 2019, 17:14
Да, первый вариант..
Вторую часть не кидал задачи, потому что её реализация у меня вопросов не вызывает.
Но для полноты картины, все же кину.
Вторая часть - это класс FailSearchEngine, который содержит в себе ссылку на Cluster и использует метод isFailed для поиска
ноды, на которой случилась ошибка. FailSearchEngine должен находить ошибочную ноду наиболее эффективным способом и
выводить на экран номер сервера и этой ноды.
0
Justinian Judge в Mega City One Master
22 июля 2019, 17:40
ты не ответил, откуда задача? Может контекст прояснит условия.
0
Mr. Mister Java Developer в Playtika
22 июля 2019, 17:43
Курсы по джаве... д\з от преподавателя...
Ты прав, тут задачка на ООП.. Тоесть, всё абстрактное, сервера и тд..
0
Justinian Judge в Mega City One Master
22 июля 2019, 18:01
Ну тогда реализуй как понимаешь, а все остальное скажут )
Есть класс КЛастер.
Он содержит коллекцию или массив объектов типа Сервер.
Объект типа Сервер содержит коллекцию/массив объектов типа НОД.
Какие поля обязательные есть перечень. Пиши.
Когда решаешь комплексные задачи очень важно разбивать на маленькие кусочки задачи. Прочитать условие и испугаться это не вариант, все можно разбить на более простые части, те еще на простые и пока не уперется в перечень конкретных простых действий, нащупай почву, плацдарм, и оттуда отталкивайся.
После прочтения этого задания на бумажке ты должен был начерчить главное, нарисовать какие-то связи, квадратики, любое удобное тебе обозначение чтобы вычленить главное, а то в тексте много информации, она запутывает.
Так что вперед, делай то что ты знаешь, я не поверю что ты не сможешь написать пару классов и поместить туда пару полей. А как на чем спотыкнешься, или будут вопросы то отписывайся здесь.
Обязательно прикрепив полный код всего что есть, гитхаб или сайты типа pastebin.com, codeshare.io, хотя если влезет можешь и через комменты текстом - не забудь тег < code >
0
Mr. Mister Java Developer в Playtika
22 июля 2019, 18:11
У меня проблема возникает, как сделать так, что бы в каждом сервере был свой масив нодов, точнее, как потом с ним взаимодействовать.
Я вроде вот так создаю их, но как потом методом вызвать конкретную ноду, конкретного сервера не понимаю.
0
Justinian Judge в Mega City One Master
22 июля 2019, 18:19
нетипизированные коллекции, свят свят свят. Где ты взял такой синтаксис? Так уже лет 15 никто не пишет.
Даже в условии же Collection<Server> указано, что прямо тебе говорит что должен быть такой класс.
Еще раз перечитай мой пост, никто не говорит что ты должен всех слушать, я просто думал вслух.
Сделай классы Server, Node, Claster, в классе Сlaster будет поле servers - коллекция/массив объектов типа Server.
в Сервере будет поле, массив/коллекция объектов типа Node.
Здесь конечно еще можно подумать насчет абстрактный классов, налседования и тд, но пока что навскидку я не вижу особой необходимости прям , здесь пару классов, в них пару полей, смысл то..
0
Mr. Mister Java Developer в Playtika
22 июля 2019, 18:22
Спасибо... попробую.
0