Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Резюме для программиста

89957   75 76 77 78 79 80 81 82 83 84 85 все
alex445 старожил05.11.21 09:29
NEW 05.11.21 09:29 
в ответ alex445 05.11.21 09:07, Последний раз изменено 05.11.21 10:52 (alex445)

Например, читаю у человека (сама статья не важна, привожу лишь один пример оттуда)


public class Turns
{
    public int CurrentTurn { get; private set; }
    
    internal void NextTurn ()
    {
        CurrentTurn++;
    }
}

В чём смысл такой архитектуры перед банальным публичным сеттером свойства CurrentTurn? Как я обезопашу себя, что кто-то присвоит CurrentTurn не то значение? Я могу вызвать метод NextTurn много раз и присвоить CurrentTurn всякую белиберду - неправильное значение. Какое-то раздувание "архитектуры" ради архитектуры.


Другие говорят, что тут мол принцип ответственности - мол, добавлять единичку к ходу (CurrentTurn) может только класс Turns, поэтому у него есть специальный метод для этого, а просто так присваивать любые значения или уменьшать их нельзя. А увеличивать сколько угодно много раз можно? Если по логике метод NextTurn не может быть вызван несколько раз подряд без проверки условий, но данная архитектура мне его вызвать позволяет, то смысла в этом всём громадье кода почти нет. Т.е. если разработчик не знает, как правильно использовать класс Turns, то он и с такой архитектурой набедокурит. А если знает, то проще дать публичный доступ к сеттеру CurrentTurn.


По моему, если так охота трястись, чтобы CurrentTurn не изменялся как попало, то тут больше подойдёт банальный публичный сеттер и валидация внутри класса Turns для свойства CurrentTurn. В представленной архитектуре я не вижу никакой особой инкапсуляции и тем более какой-то особой защиты от дурака по произвольному изменению свойства CurrentTurn.


Чел просто набросал гору кода, которая ничего не гарантирует, зато внешне по методичкам написана. Я такого кода полно встречал в разных примерах в интернете. Люди городят всякие инкапсуляции ради инкапсуляций, закрывают всё подряд, потом делают кучу методов, которые тупо дают доступ вместо закрытых свойств. Якобы они ограничивают тип доступа - типа только инкремент на 1, или только умножение. Но то, что я и с этими ограничениями могу натворить дел - это игнорируется. В результате есть раздутый класс строк на 100, который, если просто сделать полностью публичные свойства, ужмётся до максимум 10 строк. Народ за деревьями леса не видит.

alex445 старожил05.11.21 09:42
NEW 05.11.21 09:42 
в ответ alex445 05.11.21 09:29, Последний раз изменено 05.11.21 10:53 (alex445)

В Юнити, кстати, чтобы привязать данное из объекта к, например, графическому компоненту, нужно это данное сделать в виде публичного поля. Не свойства. Что, принципы ООП летят к чертям?

MrSanders коренной житель05.11.21 10:46
NEW 05.11.21 10:46 
в ответ alex445 05.11.21 09:42

Для общего развития: а какую букву в SOLID нарушает "публичное поле"?

alex445 старожил05.11.21 10:50
NEW 05.11.21 10:50 
в ответ alex445 05.11.21 09:42, Последний раз изменено 05.11.21 10:55 (alex445)

Чем моя последняя работа была похожа на то, что я выше описывал - игровой проект и некий класс, к которому должны иметь доступ множество других классов, компонентов и т.д. - было клиент-серверное (или лучше сказать многокомпонентное) взаимодействие с очень частыми (буквально в реальном времени) изменениями состояния одного из компонентов в зависимости от пришедших с другого компонента данных. Одним компонентом была плата сбора данных, другим - десктопное приложение. Нужно было показывать анимированный график, отображающий ход процесса и расчёта. Там я тоже применил некий объект, в котором весь расчёт и происходил, и который хранил своё состояние. И также шарил этот объект среди десятков классов той же вью модели, чтобы она могла вытащить оттуда результаты и привязать их к контролам представления (включая графики). Только делалось всё это несколько раз в секунду.

alex445 старожил05.11.21 10:53
NEW 05.11.21 10:53 
в ответ MrSanders 05.11.21 10:46

Поправил - не СОЛИД, а ООП.

MrSanders коренной житель05.11.21 11:27
NEW 05.11.21 11:27 
в ответ alex445 05.11.21 10:53

Так и хочется спросить какую букву в ООП открытое поле нарушает... Я так понимаю вас инкапсуляция интересует, да? Если "скрывать" нечего, то можно доступ за методами и не прятать. Если последнюю наносекунду сэкономить надо. Пока всё в одном потоке проблем не будет. Лично я всё равно спрятал бы за get/set, не RTS же разрабатываем.

Murr патриот05.11.21 12:11
Murr
NEW 05.11.21 12:11 
в ответ alex445 05.11.21 09:07

Это должно быть в

-----

А почитать что из себя представляет паттерн Singleton как-то вне возможностей?

То, что ты описываешь паттерну не соответствует.


А с методами легче?

-----

Как раз тот момент, когда знание того что есть сеттер и геттер может позволить не говорить глупости.

Murr патриот05.11.21 12:16
Murr
NEW 05.11.21 12:16 
в ответ alex445 05.11.21 09:29

Как я обезопашу себя, что кто-то присвоит CurrentTurn не то значение?

-----

Действительно - Как?

Я вот хочу кусочек теста в котором это будет сделано... смущ

alex445 старожил05.11.21 12:59
NEW 05.11.21 12:59 
в ответ Murr 05.11.21 12:16

Как я обезопашу себя, что кто-то присвоит CurrentTurn не то значение?

-----

Действительно - Как?

Я вот хочу кусочек теста в котором это будет сделано... смущ

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

alex445 старожил05.11.21 13:14
NEW 05.11.21 13:14 
в ответ alex445 05.11.21 12:59

Глянул sql.ru - в дотнетовском разделе ни одной длинной темы, чтобы страниц на 10 минимум. Все старые старпёры сидят, как и 5-10 лет назад, а срачей споров нет.

Hryu свой человек05.11.21 14:12
NEW 05.11.21 14:12 
в ответ alex445 05.11.21 13:14

Долго же ты на дереве сидел... Evergreen Tree on Apple iOS 14.6Mushroom on Apple iOS 14.6

Murr патриот05.11.21 14:12
Murr
NEW 05.11.21 14:12 
в ответ alex445 05.11.21 12:59

по приведённому фрагменту класса непонятно

-----

Как же ты будешь работать с чужим кодом... и кто после тебя сможет что-то поправить... безум

AlexNek патриот05.11.21 19:25
AlexNek
NEW 05.11.21 19:25 
в ответ alex445 04.11.21 13:55
А что профилировщики показывают?

Будет время, выложу примерчик, поиграетесь с профайлером для веб ассембли. спок

AlexNek патриот05.11.21 19:27
AlexNek
NEW 05.11.21 19:27 
в ответ alex445 04.11.21 13:54
Я так толком Блейзор и не пощупал.

Не нужно всё обобщать, речь идёт только о клиентской части + PWA.

AlexNek патриот05.11.21 19:32
AlexNek
NEW 05.11.21 19:32 
в ответ MrSanders 04.11.21 14:19
При микросервисы

А Florian Rappl не канает? Хотя бумажные книги уже давно не интересуют.

AlexNek патриот05.11.21 19:36
AlexNek
NEW 05.11.21 19:36 
в ответ alex445 04.11.21 19:53
Проблема (скорее, вопрос), как расшарить его

В упор не понимаю вопрос смущ

MrSanders коренной житель05.11.21 20:13
NEW 05.11.21 20:13 
в ответ AlexNek 05.11.21 19:32
А Florian Rappl не канает?

Мне имена не помогают. Мне б Дийкстру, Кнута или Мартина не забыть - уже радость :) Как называется?

AlexNek патриот05.11.21 20:55
AlexNek
NEW 05.11.21 20:55 
в ответ MrSanders 05.11.21 20:13

Не, он еще книгу не дописал. Но как то и так пока хватает, он на всех конференциях. И Microfrontend фрейморк вроде написал.

https://florian-rappl.de/


Срыв покровов патриот05.11.21 23:14
NEW 05.11.21 23:14 
в ответ alex445 05.11.21 09:07
Как лучше сделать - тупо дать публичный доступ к изменению свойств (сеттерам), или городить методы типа SetProperty1, SetProperty2 и т.п.? Видел какие-то непонятные подходы, где сеттеры непубличны, геттеры публичны, зато публичны методы изменения свойств. В чём смысл, если так и так свойство можно поменять извне, но только через метод, а не свойство?

это явистов пустили в c#, они по старой памяти геттеры с сеттерами везде пихают))

Срыв покровов патриот05.11.21 23:18
NEW 05.11.21 23:18 
в ответ alex445 05.11.21 09:07
public static Singleton Instance { get { return instance; } }
Это должно быть в некоем статическом классе типа MySingletonServices?

Это должно быть в самом классе Singleton, чувак)))