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 ответов

10 просмотров

ппц полотно

Дэни-Па Автор вопроса
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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта