Сегодня задали интересный вопрос - как и где хранить глобальные переменные. Человек привык создавать в Delphi отдельный модуль, в котором хранил глобальные переменные и методы. Это большая проблема Delphi, что он умеет создавать глобальные переменные. По правилам OOP не должно быть такой возможности, и в C# такой возможности нет!
Но как же тогда поступить, если хочется создать что-то глобальное? Сначала нужно подумать 10 раз, а действительно ли нужна эта глобальность. Забудьте Delphi как страшный сон и вообще забудьте, что может быть такая возможность, как глобальная переменная или метод. Просто подумайте и ответьте себе на следующие вопросы:
1. Действительно ли нужно, чтобы к переменной мог быть доступ откуда угодно? Если нет, то создайте свойство у какого-нибудь самого подходящего класса.
2. Может переменная по смыслу относится к какому-то классу? Если да, то опять же создайте свойство у какого-нибудь самого подходящего класса.
3. Может у вас код логики в классах с визуальным интерфейсом? Если да, то лучше удалить код, и начать писать заново, только проектировать код, а не лепить.
Если ты сейчас думаешь "да задолбал ты, просто скажи, как сделать глобальную переменную или метод", то в таком случае просто говорю:
В таких случаях в C# и других реально объектных языках используют статичные переменные и методы. Просто создайте файл, в который будете кидать весь свой глобальный мусор:
namespace GlobalTrash { class MyGlobalTrash { public static int MiGlobalVariable; public static void MiGlobalFunction() { } } }
Теперь в любом месте программы вы можете обратиться к переменным и методам так: GlobalTrash.MyGlobalTrash.MiGlobalVariable = 10;. Но еще раз хочу посоветовать создавать глобальные переменные только в крайнем случае.
В принципе, можно не создавать отдельный класс и namespace, а использовать класс Program, который итак уже есть в программе в файле Program.cs.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Этим мне и нравиться C#. После перехода с Delphi мне было чертовски непривычно, но потом я прочувствовал эту фичу. И код легче поддерживать (я про static) и все как-то на виду, в отличии от Delphi.
Хотя это относится к старым версия дельфина. В последних версиях, в Delphi появились так называемые классовые методы/переменные - аля статичные.
Все таки хорошо, что Delphi продолжает развиваться.
Я как-то писал клиент для MySQL на C++.NET (изврат конечно), но там нужно было где-то хранить настройки (пароль, имя пользователя, порт, имя базы и т.д.). Пришлось делать через глобальные переменные, т.к. окон было много, приписать к какому то классу было нельзя, а может и можно (на ум ничего не пришло).
Как быть в таких случаях?
Еще намучался с передачей данных между формами, где то можно было напрямую с одной формы на другую, а где то, только через глобы(
Зачем настройки соединения нужны окнам? Они нужны там только в одном случае - у тебя код доступа к базе находиться в классах с окнами. Это очень плохо. Нужно отделить это дело.
Ммм... Нужно выкинуть код доступа к базе в отдельный класс? Тогда значит, нужно передавать из класса данные, которые будут получены из базы, в класс окна и заполнять все поля этими данными?
2Сергей
Delphi - очень хороший язык. Но любому программисту, перешедшему с Delphi на C# нужно забыть практически все, что он делал на Delphi.
Точно так же я скажу любому программисту, который переходит с C# или Java на Delphi - "забудьте C# и Java". Иначе не получиться написать успешный проект.
Писать действительно можно одинаково, но не всегда это нужно. Просто у этих языков и библиотек подход разный. Я считаю, что писать нужно с использованием языка и его преимуществ. А не пытаться реализовать в языке преимущества других.
2psycho-coder
Жди отдельную заметку
Решил все же не писать заметку.
Подход Delphi: компоненты доступа к данным располагаются в отдельном модуле DataModule. Этот модуль создается при запуске приложения и любая форма обращается к модулю и может выполнять запросы у себя в классе и обрабатывать данные.
В принципе, ты можешь то же самое реализовать на C#. Создай отдельный класс, который будет создаваться при запуске приложения. Это будет у тебя как бы DataModule. Можешь даже называть его так же. Ссылка на класс будет статична (глобальна). В этом классе будет компонент для создания соединения с базой данных и объекта таблиц и запросов. Ты можешь в любом окне обратиться через статичную переменную к этому классу и получить объект любой таблицы для работы с ним. Не нужно хранить глобально все параметры, достаточно одной переменной, указывающий на объект модуля данных.
Но я уже давно говорю, что надо идти дальше и полностью отделять код от логики. Форма должна получать от DataModule не объект, через который можно получить данные, а НЕПОСРЕДСТВЕННО ДАННЫЕ. В формах должны быть вызовы в стиле:
DataModule.ДайМнеДанныеХХХ();
Результатом может быть набор данных, и можно даже в виде массивов, а не в виде Table.
Опять же, в Delphi можно так же сделать, но никто не делает, потому что сама VCL написана в стиле 70-хх годов и примеры с Delphi поставляются в стиле 70-х годов.
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....
Всем привет!
Проблема - в одном из классов библиотечной сборки нужно установить событие, которое бы виделось в главной сборке, ну и во всех остальных заодно.
Спасибо!!!
Может в реальной жизни глобальные переменные - это и зло, но для моей курсовой - самое то)))
Здравствуйте, Михаил!
Еще вопрос по C# VS.
Происходит неожиданное изменение глобальной переменной типа байт, объявленной в классе Programs. Она вдруг принимает значение 0.
Есть ли возможность в отладчике Vs отследить когда она принимает это значение?
Спасибо!
Сегодня отвечал на такой вопрос по почте
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.