170 похожих чатов

Пытаюсь научиться писать код по принципам программирования. Начал с SOLID.

И столкнулся с проблемой. Буду очень благодарен за помощь в поиске решения.
Задача:
1) Получить из БД строки
2) Сгруппировать их по полю EventType, которое предварительно необходимо очистить от лишних пробелов
3) Обновить поле status в БД для каждой полученой строки

Вносить изменения в функцию на сервере БД я не могу.

У меня есть тип events
type events struct {
events map[string]*event
}
И для него есть такой метод. Имя постарался дать максимально отражающее то, что я хочу от этой функции:
Код на playground (запустить нельзя, но с компа читать удобнее): https://play.golang.org/p/T6apMlrULJs


func (e *events) getEventsFromSQLGroupedByEventType()(groupedEvents map[string][]*event){

// 1) Получаем строки
rows, dbQueryErr := db.Query("...")
if dbQueryErr != nil {
return
}
defer rows.Close()

for rows.Next() {
event := new(event)
rowsScanErr := rows.Scan(
&event.Id,
&event.EventType,
)

if rowsScanErr != nil {
fmt.Println(rowsScanErr)
return
}

// 2) Очищаем поле EventType от лишних пробелов
eventType := strings.TrimSpace(event.EventType.String)

// 2) Группируем строки по полю EventType
groupedEvents[eventType] = append(groupedEvents[eventType], event)

// 3) фиксация данных в БД для этой строки
...
}
return
}
Первый вопрос: является ли побочным эффектом то, что я очищаю поля eventType от лишних пробелов? Или можно не придавать этому значение и не указывать это ни в названии функции, ни выносить в какой-то отдельный логичный метод?


У меня пока есть только один вариант решения:
По принципу single responsibility я разбить все это на три функции и поместить их как методы для типа events
1) events.getEventsFromSQL()
2) events.groupEventsByEventType()
3) events.updateEventsStatusInDB()
По принципу open–closed я должен и метод groupEventsByEventType превратить в:
events.groupEventsBy("EventType")Но это влечет за собой кучу логики, которая пока не нужна. И следуя принципу YAGNI я это игнорирую.

Дальше для удобства можно создать некий метод init где буду вызывать их по очереди.
func (e *events) init(){
e.events = events.getEventsFromSQL()
events.groupEventsByEventType()
events.updateEventsStatusInDB()
}
Но тут проблема в том, что в каждой из этих функций я должен пройтись по всем элементам мапы events. И мне кажется это излишним.

21 ответов

4 просмотра

ппц полотно

Дэни-Па Автор вопроса
quantum super position
ппц полотно

Постарался компактно уложить все свои мысли, что бы проще было понять вопрос. Но вы правы, вышло все равно полотно D:

Для вас Го первый язык?

Дэни-Па Автор вопроса
Михаил
Для вас Го первый язык?

Второй, первый javascript

почитайте стива макконела - совершенный код

Дэни Па
Второй, первый javascript

Я понимаю что это не ответ на вопрос, но может вам с джавы начать?

Дэни-Па Автор вопроса
Artur Karapetov
эт не язык :D

Ну, эту тему можно долго обсуждать) В целом мой вопрос даже не к языку относится, а к организации кода

Михаил
Я понимаю что это не ответ на вопрос, но может вам...

ну типа JAVAscript пройден, осталось JAVA изучить

Дэни-Па Автор вопроса
Artur Karapetov
почитайте стива макконела - совершенный код

Я сейчас Чистый Код Роберта Мартина читаю

Artur Karapetov
ну типа JAVAscript пройден, осталось JAVA изучить

а потом изучить то на чем написана жава

Artur Karapetov
ну типа JAVAscript пройден, осталось JAVA изучить

Если вы эти язык рядом ставите, то точно с джавы.

quantum super position
а потом изучить то на чем написана жава

а потом изучить то на чем написано то на чем написана жава?

Отложите Чистый код и не заморачивайтесь. Вернётесь к этой книге через несколько лет когда наберетесь опыта. Все вопросы отпадут

Anton Kucherov
Отложите Чистый код и не заморачивайтесь. Вернётес...

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

Михаил
Ваш список?

google.com:80 http://google.com http://www.google.com https://google.com https://www.google.com

Похожие вопросы

Обсуждают сегодня

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
31
Здравствуйте. Задача состоит в том, чтобы сделать real-time чат в мобильном приложении. После передачи сообщения пользователем через веб-сокеты, для основного и долговременног...
🐾
5
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Где можно найти примеры эффективного "асинхронного" tcp сервера на C? Я видел select, kqueue, poll, epoll и т.д. Ввод-вывод неблокирующий, но обработка клиентов блокирующая
#
10
Всем доброго дня, ребят подскажите пожалуйста, если в курсе по ассемблеру используется MASM32, могу ли я использовать FASM? В чем явная разница и будет ли у меня все работать?
Botsman
17
Hi Everyone! To all Are you Looking for Interview Support at the Lowest Price? Look no further! Then contact us 👉We offer Interview Support :-for a low cost variety of tech...
Rambabu Nallamilli
3
Книга Юрова В.И пойдёт для обучения?
Botsman
24
Hello experts, Could someone kindly tell me how to run vacuum inside a plpgsql function? If you have any link please share. Thank you
Amol Palav
10
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Карта сайта