Глобальні змінні в c # блог михаила флёнова

Сьогодні задали цікаве питання - як і де зберігати глобальні змінні. Людина звикла створювати в Delphi окремий модуль, в якому зберігав глобальні змінні і методи. Це велика проблема Delphi, що він вміє створювати глобальні змінні. За правилами OOP не повинно бути такої можливості, і в C # такої можливості немає!

1. Чи дійсно потрібно, щоб до змінної міг бути доступ звідки завгодно? Якщо немає, то створіть властивість у якого-небудь самого підходящого класу.

2. Може змінна за змістом відноситься до якогось класу? Якщо так, то знову ж створіть властивість у якого-небудь самого підходящого класу.

3. Чи може у вас код логіки в класах з візуальним інтерфейсом? Якщо так, то краще видалити код, і почати писати заново, тільки проектувати код, а не ліпити.

Якщо ти зараз думаєш "так задовбав ти, просто скажи, як зробити глобальну змінну або метод", то в такому випадку просто говорю:

У таких випадках в C # та інших реально об'єктних мовах використовують статичні змінні і методи. Просто створіть файл, в який будете кидати весь свій глобальний сміття:

Тепер в будь-якому місці програми ви можете звернутися до змінних і методів так: GlobalTrash.MyGlobalTrash.MiGlobalVariable = 10 ;. Але ще раз хочу порадити створювати глобальні змінні тільки в крайньому випадку.

В принципі, можна не створювати окремий клас і namespace, а використовувати клас Program, який тепер вже є в програмі у файлі Program.cs.

Spider_NET

Цим мені і подобається C #. Після переходу з Delphi мені було страшенно незвично, але потім я відчув цю фічу. І код легше підтримувати (я про static) і все якось на увазі, на відміну від Delphi.

Хоча це відноситься до старих версія дельфіна. В останніх версіях, в Delphi з'явилися так звані класові методи / змінні - аля статичні.

Все таки добре, що Delphi продовжує розвиватися.

psycho-coder

Я якось писав клієнт для MySQL на C ++. NET (перекрутив звичайно), але там потрібно було десь зберігати налаштування (пароль, ім'я користувача, порт, ім'я бази і т.д.). Довелося робити через глобальні змінні, тому що вікон було багато, приписати до якого то класу було не можна, а може і можна (на розум нічого не прийшло).
Як бути в таких випадках?

Ще намучився з передачею даних між формами, де то можна було прямо з однієї форми на іншу, а де то, тільки через глоби (

Михайло Фленов

Навіщо настройки з'єднання потрібні вікнам? Вони потрібні там тільки в одному випадку - у тебе код доступу до бази перебувати в класах з вікнами. Це дуже погано. Потрібно відділити цю справу.

Забудьте Delphi як страшний сон


Михайло, навіщо ж так зневажливо?
Чи не правильно було б сказати "забудьте ваші неправильні навички кодування на Delphi, як страшний сон". Саме середовище Delphi тут ні в чому не винна.
Чим об'єктно-орієнтовані можливості Delphi слабкіше ніж в C #?
У нормальних книгах по Delphi чорним по білому не рекомендується використання глобальних змінних.
І нічого не заважає в Delphi так само як в твоєму прикладі для C # обернути все глобальні змінні в клас і звертатися до них через властивості.
Delphi повністю об'єктно-орієнтована мова програмування. І нічого не заважає кодувати з його допомогою "просунуте" (100% -тної об'єктно орієнтовано).

psycho-coder

Ммм. Потрібно викинути код доступу до бази в окремий клас? Тоді виходить, потрібно передавати з класу дані, які будуть отримані з бази, в клас вікна і заповнювати всі поля цими даними?

Михайло Фленов

Delphi - дуже гарна мова. Але будь-якому програмісту, який перейшов з Delphi на C # потрібно забути практично всі, що він робив на Delphi.

Точно так же я скажу будь-якому програмісту, який переходить з C # або Java на Delphi - "забудьте C # і Java". Інакше не вийде написати успішний проект.

Писати дійсно можна однаково, але не завжди це потрібно. Просто у цих мов і бібліотек підхід різний. Я вважаю, що писати потрібно з використанням мови і його переваг. А не намагатися реалізувати в мові переваги інших.

Михайло Фленов

Жди окрему замітку

Михайло Фленов

Вирішив все-таки не писати замітку.

Результатом може бути набір даних, і можна навіть у вигляді масивів, а не у вигляді Table.
Знову ж таки, в Delphi можна так само зробити, але ніхто не робить, тому що сама VCL написана в стилі 70-хх років і приклади з Delphi поставляються в стилі 70-х років.

psycho-coder

2Міхаіл
Дякуємо. Потрібно буде подумати над цим гарненько). А прогу доведеться переписувати з нуля, тому що виправляти те що там є немає сенсу.

[Offtop] я тільки що зрозумів, що не можу нормально висловити думку ((([/ offtop]

[QUOTE]
Delphi - дуже гарна мова. Але будь-якому програмісту, який перейшов з Delphi на C # потрібно забути практично всі, що він робив на Delphi.

Точно так же я скажу будь-якому програмісту, який переходить з C # або Java на Delphi - "забудьте C # і Java". Інакше не вийде написати успішний проект.

Писати дійсно можна однаково, але не завжди це потрібно. Просто у цих мов і бібліотек підхід різний. Я вважаю, що писати потрібно з використанням мови і його переваг. А не намагатися реалізувати в мові переваги інших.
[/ QUOTE]
Привіт Михайло!
Для початку хотілося б висловити Вам вдячність і повагу за ваші книги. Буквально недавно я вчився програмувати по другому виданню Біблії Delphi. І це допомогло мені зробити "швидкий старт". Це була перша моя паперова книга з програмування.
Але, я все-таки хочу висловити незгоду з тезами такими як "забудьте як ви робили в Дельфі". Просто тому що як раз в підходах особливої ​​різниці між дельфи і сішарп немає. Є різниця в концепції, але це нас прикладних програмістів сильно не хвилює.
Ось наприклад, я в своїх проектах взагалі не використовую підпрограми і змінні поза класів, і навіть перемістити з модуля з класом форми глобальний екземпляр в dpr-файл.
Далі, з подіями, дженериками, анонімними методами і атрибутами я познайомився в Дельфи.
Читаючи MSDN по C # я практично не зустрічаю революційно нового - основне вже знайоме по дельфи, не рахуючи специфічних штучок дотнета.
Про відмінності в архітекури стандартних бібліотек - так, ядро ​​RTL зроблено в процедурному стилі. Основна причина цього - швидкодія.
Але головне достоїнство дельфи VCL є якраз таки уособленням ООП підходу, і стала прообразом Windows.Forms.
Я це все до того що не варто вішати ярлики на дельфістов нібито вони всі використовують глобальні змінні. Тут надається свобода і програміст сам вирішує, ось я для себе і вибрав об'єктно-орієнтований підхід.
Чому я вивчаю C #? Відповідь проста: багатша стандартна бібліотека, WPF, ASP.NET, і легше знайти роботу.
З повагою, Дмитро.

Михайло Фленов

"Забудьте як ви робили в Дельфі" тому що в Дельфі можна використовувати глобальні змінні, а в C # їх просто немає (може я щось пропускаю).

У C # і Delphi все ж багато різного. VCL дуже схожа на Delphi, але вони тільки схожі. Особисто для мене ці мови більше різні, ніж схожі.

Вони спочатку повинні були бути схожі, хоча б тому, що їх проектував одна людина.
Спочатку сішарп багато позаімствоал з дельфи, а тепер дельфи запозичує у сішарпа.
З С ++ набагато менше схожості, синтаксис не рахується, тому що це не принципово.
Хтось не пам'ятаю точно хто сказав що сішарп це 75% Джави і 25% дельфи. Тепер про дельфи можна сказати що там 50% сішарпа.
Не знаю, може Ви просто зовсім не стежите за останніми версіями дельфи?

Михайло Фленов

Рядок підключення не повинна бути доступна всьому додатком. Вона повинна бути доступна тільки одному - двох класів, в яких ти працюєш з даними і де у тебе будуть знаходитися об'єкти SqlConnection.

Проблема - в одному з класів бібліотечної збірки потрібно встановити подія, яка б бачилося в головній збірці, ну і у всіх інших заодно.