Глобальні змінні в 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.
Проблема - в одному з класів бібліотечної збірки потрібно встановити подія, яка б бачилося в головній збірці, ну і у всіх інших заодно.