Форум программистов, компьютерный форум, киберфорум
Наши страницы
XLAT
Войти
Регистрация
Восстановить пароль
Рейтинг: 1.00. Голосов: 1.

Начала орхетектуры.

Запись от XLAT размещена 04.04.2019 в 11:58
Обновил(-а) XLAT 04.04.2019 в 15:15

Код:
const статус: ещё не готово...
[Про глобалы.]

ок, для затравки:
когда я был маленький,
я любил глобалы(глобальные переменные), ага, а кто их не любил, когда был маленький?
А также я хотел написать MMORPG. Но щас не про игру.

так вот когда у меня в первый раз рухнул мой проЭкт, то пришлось собрать всю свою волю в кулак,
чтобы найти ошибку(логическую), так как сам проЭкт был не очень маленький(~100файлов) и сходу найти ошибку не получилось.

Ошибку я нашел, но для этого
пришлось приобщиться к общей массе кодерков, в тот момент, когда на меня снизошло понимание, что:
"КОМПИЛЯТОР НЕ ГАРАНТИРУЕТ НЕИЗМЕННЫЙ ПОРЯДОК ИНИЦИАЛИЗАЦИИ".

Способ борьбы с этой хренью я нашел быстро:
ПРАВИЛО ОБЩЕГО ГЛОБАЛА:
Все глобальные переменные для ОБОСОБЛЕННОЙ подсистемы должны быть объявлены в одном файле!

Блин, чай побери, я никогда до этого и после этого не слышал ничего по теме этого правила!
Ну, кроме, нытья, про то как глобалы вредят здоровью и поэтому их следует избегать.
Что безусловно есть правда!

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

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

Что же касается меня, то я не гений и в моем программировании такой уровень должен присутствовать,
но и для гениев тоже, если они пишут код не в одно лицо.

....
Размещено в Об орхитектуре...
Просмотров 572 Комментарии 32
Всего комментариев 32
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Цитата:
    Блин, чай побери, я никогда до этого и после этого не слышал ничего по теме этого правила!
    Потому что это глупость.

    Правило: гл. переменных вообще не должно быть или их количество должно быть минимальным.
    Любое распределение переменных и пр. сущностей по файлам должно быть в первую очередь логичным, по смыслу, а не все в кучу.
    Запись от Avazart размещена 04.04.2019 в 13:51 Avazart вне форума
  2. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от Avazart
    Потому что это глупость. .
    читайте внимательно:
    Цитата:
    ... для обособленной подсистемы ...
    и ваше:
    Цитата:
    Сообщение от Avazart
    распределение переменных и пр. сущностей по файлам должно быть в первую очередь логичным, по смыслу
    Вы другими словами повторили(или разъяснили) то, что я написал в первопосте.
    Cпсбо, конеш.

    Так или иначе, на текущем этапе я продолжаю использовать глобалы, только уже в виде цельных законченных подсистем.
    Самый банальный пример: это конфиг и логирование.
    Запись от XLAT размещена 04.04.2019 в 14:53 XLAT вне форума
    Обновил(-а) XLAT 04.04.2019 в 15:05
  3. Старый комментарий
    Аватар для Avazart
    Цитата:
    для обособленной подсистемы ...
    Не стоит обфусцировать ... )))

    Цитата:
    это конфиг и логирование.
    Конфиг как это константы, а не переменные.
    Запись от Avazart размещена 04.04.2019 в 22:26 Avazart вне форума
    Обновил(-а) Avazart 04.04.2019 в 22:28
  4. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Конфиг как это константы, а не переменные.
    у меня необычный конфиг,
    отдельные переменные сохраняют в него свое состояние,
    например, положение и размер окна, не важно насколько это востребовано.

    Или, в конфиг можно добавить любую простую переменную автоматом
    одной строчкой в коде:
    C++
    1
    2
    3
    
    int yeаr;
    ...
    GETVAL_FROM_CONFIG(yeаr, 2019);
    если yeаr не будет в конфиге найден, то он автоматом там сгенерируется с дефолтным значением 2019.

    Или если будет обнаружено в конфиге некорректное значение, то оно автоматом будет сброшено в дефолт.

    Так что не спешите с константой.

    По глобалу, хочу добавить, что мое правило глобала не является каким то архитектурным прибамбасом,
    а всего лишь пилюля для выживания.
    Но применяя это правило, я обнаружил как раз архитектурный прибамбас,
    что разброссаную инициализацию по файлом, как раз нужно собирать, только не в одну кучу, а кучки по смысловому содержанию.
    Собсно, да, декомпозиция это наше усё, но неправда ли, что тут пахнет композицией
    Запись от XLAT размещена 05.04.2019 в 06:38 XLAT вне форума
    Обновил(-а) XLAT 09.04.2019 в 12:30
  5. Старый комментарий
    Аватар для Puporev
    А что такое орхетектура?
    Запись от Puporev размещена 05.04.2019 в 21:17 Puporev вне форума
  6. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от Puporev Просмотреть комментарий
    А что такое орхетектура?
    орхетектура это алхимический камень программирования,
    пока он не найден вами, вы не можете знать что это такое.
    Запись от XLAT размещена 05.04.2019 в 22:30 XLAT вне форума
  7. Старый комментарий
    Порядок инициализации = ?
    Никогда не думал, что С++ настолько плох!
    Запись от wer1 размещена 06.04.2019 в 07:08 wer1 вне форума
  8. Старый комментарий
    Аватар для Avazart
    Цитата:
    А что такое орхетектура?
    - Как правильно пишется хирург или херург?
    - А это зависит от того какой врач.
    Запись от Avazart размещена 08.04.2019 в 22:22 Avazart вне форума
  9. Старый комментарий
    Аватар для Avazart
    Цитата:
    у меня необычный конфиг,
    отдельные переменные сохраняют в него свое состояние,
    например, положение и размер окна, не важно насколько это востребовано.
    Это лажа, это то как не нужно делать... прямо по учебнику.
    Переменные должны быть объявлены максимально локально - т.е максимально близко к месту использования.
    Другое правило - не используйте макросы ...
    Запись от Avazart размещена 08.04.2019 в 22:25 Avazart вне форума
    Обновил(-а) Avazart 08.04.2019 в 22:28
  10. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Другое правило - не используйте макросы ...
    я не настолько принципиален, поэтому всегда предпочту писать:

    C++
    1
    
    GETVAL_FROM_CONFIG(year, 2019);
    чем

    C++
    1
    
    config.getval("year", year, 2019);
    Запись от XLAT размещена 08.04.2019 в 22:49 XLAT вне форума
  11. Старый комментарий
    Аватар для CoderHuligan
    Если глобальных вообще не должно быть, то почему они есть в любом классе (внутри класса)? Скажу по секрету, что они там для удобства.
    Запись от CoderHuligan размещена 09.04.2019 в 11:35 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 09.04.2019 в 11:36
  12. Старый комментарий
    Аватар для Usaga
    Внутри класса только члены класса. И "глобальным" они становятся, если сделать их статическими, что часто - фу.
    Запись от Usaga размещена 09.04.2019 в 11:49 Usaga на форуме
  13. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    И "глобальным" они становятся, если сделать их статическими, что часто - фу.
    Речь и идёт только о том, что в классе..
    Внутри класса - глобальные переменные, которые доступны, так или иначе, через this(неявный указатель на текущий экземпляр). Вы не может вот так просто взять какой-либо метод, и использовать его в другом месте, т.к. он связан со своим контекстом. Если контекст(скоуп) глобален, по настоящему, по пацански, то это возможно. Без глобал переменных мы вынуждены передавать сверху вниз по цепочке все параметры, которые нужны подчинённому методу, а это боль в заднице. Поэтому и придумали классы, чтобы не так болело в нижнем месте. Но это всё равно не правильно..
    Запись от CoderHuligan размещена 09.04.2019 в 13:34 CoderHuligan вне форума
  14. Старый комментарий
    Аватар для Usaga
    Члены класса не являются "глобальными". Другие объекты, хоть и того же класса, к ним доступа не имеют, если таковое не предоставляется самим классом. Это ниразу не глобальность.

    Цитата:
    Вы не может вот так просто взять какой-либо метод, и использовать его в другом месте, т.к. он связан со своим контекстом.
    В том же JavaScript могу. И это реальный геморрой. Адский.
    Запись от Usaga размещена 09.04.2019 в 14:22 Usaga на форуме
  15. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Другие объекты, хоть и того же класса, к ним доступа не имеют
    Зато имеют методы родного..
    Цитата:
    В том же JavaScript могу. И это реальный геморрой.
    Можно, ведь там функции - литералы, по сути строки, но это вам не поможет если нам нужно использовать функцию как общеразделяемый компонет.. Общеразделяемый всей системой.. Для меня слово инкапсуляция это не тогда, когда пытаются скрыть в классе переменные и функции от остального мира, это можно сделать и простым нэймспейсом. Для меня это то, что позволяет изменить что-либо в одном месте, не меняя это в другом, вот и вся "капсуляция".. А сейчас классы в ооп используют только как алтер_эго модульного принципа, т.е. как хранилища процедур и подчинённых переменных, которые связаны по смыслу использования. Обьектами там и не пахнет.. Хотя все думают, что оперируют обьектами, но на самом деле создают себе в будущем большие проблемы. Обьект это то, что можно переслать по сети, загрузить на диск или с диска, и т.д. Пересылать обьект по сети вместе с его методами это сто-то с чем-то.
    Запись от CoderHuligan размещена 09.04.2019 в 14:39 CoderHuligan вне форума
  16. Старый комментарий
    Аватар для Usaga
    Цитата:
    Зато имеют методы родного..
    Только свои собственные. К методам того же класса без ссылки на этот класс они обратиться не могут. Так, что никакой глобальности.

    Цитата:
    Можно, ведь там функции - литералы, по сути строки
    В JS функции - это функции, а литералы - это литералы, строковые или объектные. Разные вещи. Не путайте.

    Цитата:
    Обьект это то, что можно переслать по сети, загрузить на диск или с диска, и т.д.
    Да и в любом языке (включая JS) такое есть. Пересылается только состояние объекта. Его методы не являются состоянием и никуда не пересылаются. Тут всё честно и корректно, что именно вам в этом не нравится?
    Запись от Usaga размещена 10.04.2019 в 06:04 Usaga на форуме
  17. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Так, что никакой глобальности.
    Я имел в виду глобальность внутри обьекта. При наследовании к тому же глобальность расширяется.
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    В JS функции - это функции, а литералы - это литералы, строковые или объектные. Разные вещи. Не путайте.
    В JS есть такое понятие, как функциональный литерал. Это когда переменной присваивается функция, а фактически её строковое представление.
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Да и в любом языке (включая JS) такое есть. Пересылается только состояние объекта. Его методы не являются состоянием и никуда не пересылаются. Тут всё честно и корректно, что именно вам в этом не нравится?
    А то не нравится, что обьект выходит не единой сущностью, которую нужно ещё поделить на составляющие с тем, чтобы одну часть переслать по сети. Искусственное изобретение, и дополнительные телодвижения.
    Запись от CoderHuligan размещена 10.04.2019 в 12:00 CoderHuligan вне форума
  18. Старый комментарий
    Аватар для Usaga
    Цитата:
    Я имел в виду глобальность внутри обьекта. При наследовании к тому же глобальность расширяется.
    Глобальность глобальна на уровне всего приложения и рамками класса не ограничивается. Иначе это не глобальность.

    Цитата:
    В JS есть такое понятие, как функциональный литерал. Это когда переменной присваивается функция, а фактически её строковое представление.
    Никаких строковых представлений нет. Переменная ссылается на функцию как есть. Без промежуточных строковых\текстовых преставлений.

    Цитата:
    А то не нравится, что обьект выходит не единой сущностью
    Ещё как выходит. Объект - только его состояние и ничего больше. Методы общие для всего класса целиком и частью состояния не являются. Поэтому всё правильно тут. Вы, когда книгу кому-то даёте, и руки в комплекте прикладываете, которые потом будут страницы перелистывать?
    Запись от Usaga размещена 10.04.2019 в 12:46 Usaga на форуме
  19. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Вы, когда книгу кому-то даёте, и руки в комплекте прикладываете, которые потом будут страницы перелистывать?
    У меня всегда руки одно, а книга другое. У меня нет обьект - "книга-руки". У меня есть обьект "Книга", без рук. У меня не книга читает саму себя, а книгу читает кто-то.
    Запись от CoderHuligan размещена 10.04.2019 в 13:37 CoderHuligan вне форума
  20. Старый комментарий
    Аватар для Usaga
    Я к тому, что методы объекта не надо передавать. Там, где он принимается, эти методы уже есть. Или они там не нужны (что ещё лучше). Простой пример: сериализация и обмен между разными системами.
    Запись от Usaga размещена 10.04.2019 в 13:57 Usaga на форуме
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.