Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальные переменные, константы, процедуры в C# 
:(
    Опции темы
wind1
Дата 13.10.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Недавно начал изучать C#, и возникла проблема - непонятно как обмениваться данными между модулями.
В Delphi всё было довольно просто - в модуле объявлялись глобальные переменные, в другом модуле прописывалась строчка uses [имя модуля с глобальными переменными] и всё - через эти переменные можно было без проблем обмениваться данными между модулями.
А как же поступать в C#? Как обмениваться данными, к примеру, между модулями двух форм? Неужели придется делать это через файлы? :(
PM MAIL   Вверх
Partizan
Дата 13.10.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Ну специально же закрепили тему наверху, чтобы таких вопросов не было =)
В следующий раз смотрите внимательнее smile

http://forum.vingrad.ru/forum/topic-52713.html


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
mihryak
Дата 14.10.2008, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



глобальные переменные - зло, и в делфи, и в шарпе ;)
PM MAIL ICQ   Вверх
Partizan
Дата 14.10.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



mihryak, и не только там )


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
elbjarn
Дата 14.10.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(Partizan @  14.10.2008,  11:30 Найти цитируемый пост)
mihryak, и не только там ) 

категорически не согласен - глобальные переменные полезны там, где они оправданны.

PM MAIL ICQ   Вверх
Partizan
Дата 14.10.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



а можно пример, где использование глобальной переменной действительно оправдано?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
elbjarn
Дата 14.10.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(Partizan @  14.10.2008,  17:24 Найти цитируемый пост)
а можно пример, где использование глобальной переменной действительно оправдано? 

тут вопрос терминологии. в c#, к примеру, глобальных переменных быть не может в принципе - они всегда будут принадлежать какому-то классу. т.е. говоря о глобальных переменных в сишарпе, мы фактически имеем в виду статические общедоступные свойства или поля класса. они используются повсеместно как и в самом фреймворке, так и в многих приложениях. к примеру, мне часто приходится использовать их в качестве полей класса Config, который занимается сохранением и считыванием настроек моего приложения.
в с++, к примеру, без глобальных переменных вообще обойтись трудно - но там объектной моделью часто пренебрегают, предпочитая использование глобальных переменных объектным вызовам. классический пример глобальной переменной там - это errno, доступ к которой обеспечивается общеизвестной GetLastError().
PM MAIL ICQ   Вверх
VK_Techno
Дата 14.10.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.9.2007

Репутация: нет
Всего: нет



Цитата(Partizan @ 14.10.2008,  17:24)
а можно пример, где использование глобальной переменной действительно оправдано?

Паттерны проектирования синглетон или абстрактная фабрика.
PM MAIL   Вверх
elbjarn
Дата 14.10.2008, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(VK_Techno @  14.10.2008,  20:15 Найти цитируемый пост)
Паттерны проектирования синглетон или абстрактная фабрика. 

именно, об этом я и говорил, когда упомянул о классе Config, обращение к которому, как правило, выглядит как
Код

string path = Config.Instance.PathToDB;


PM MAIL ICQ   Вверх
PashaPash
Дата 14.10.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



VK_Techno, elbjarn, синглтоны - больше зло, чем добро. IMHO, их использование оправдано только для конфигурации и классов типа Application. 
Проблема как раз в в примере:
Код

string path = Config.Instance.PathToDB;

Стандартный способ работы с конфигурацией не подразумевает наличие синглтона, по крайней мере явно:
Код

var someSection = ConfigurationManager.GetSection("appSettings");

Может там внутри и статическая переменная, но она точно не глобальная.


--------------------
PM MAIL WWW   Вверх
elbjarn
Дата 14.10.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(PashaPash @  14.10.2008,  21:10 Найти цитируемый пост)
синглтоны - больше зло, чем добро. IMHO, их использование оправдано только для конфигурации и классов типа Application. 

и тем не менее, это как раз тот пример, когда применение глобальных переменных оправданноsmile.
но кстати не только конфигурации и application. представьте себе, что вы создаете сайт по всем канонам трехзвенной архитектуры. вы стремитесь сделать независимость вашего приложения от БД максимальной. естественно, вы создаете некоторый провайдер данных, что-то вроде MySiteDataProvider, который содержит разные интересные методы или классы (GetLatestNews(), например, и тд). так вот, у вас может быть несколько вариантов таких провайдеров: MySiteDataProviderAccess, унаследованный от общего абстрактного предка, определяет взаимодействие с MS Access; MySiteDataProviderMSSQL - для ms sql, и так далее. 

во всем вашем приложении вы работаете с данными таким образом:
Код

List<News> list = DataProvider.Instance.GetLatestNews();
,
 а реализация DataProvider в данном случае выглядит примерно так:
Код

public class DataProvider
{
  public static Instance 
 { 
    if (в приложении надо использовать БД MS SQL)
      return MySiteDataProviderMSSQL.Instance;
    else (в приложении надо использовать аксесс)
      return MySiteDataProviderAccess.Instance;
 }
}

имхо, очень изящное решение, основанное на пресловутых статических полях и свойствах.
PM MAIL ICQ   Вверх
PashaPash
Дата 14.10.2008, 21:46 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(elbjarn @  14.10.2008,  21:24 Найти цитируемый пост)
и тем не менее, это как раз тот пример, когда применение глобальных переменных оправданно

Да, но глобальные - это когда область видимости у объекта - все приложение. Т.е. когда или поле - public (гм), или свойство явно намекает что вернет синглтон (Instance). Стандартная реализация не упоминает синглтоны, хотя они там ес-но есть где-то внутри smile

Цитата(elbjarn @  14.10.2008,  21:24 Найти цитируемый пост)
но кстати не только конфигурации и application. представьте себе, что вы создаете сайт по всем канонам трехзвенной архитектуры. вы стремитесь сделать независимость вашего приложения от БД максимальной.

А вот этот пример как-раз показывает основную проблему синглтонов - нет нормального управления временем жизни. Т.е. создается один Instance на приложение. Что делает очень трудным написание, например, тестов, которые должны работать независимо друг от друга. Пример:
Код

public class DataProvider
{
  public static Instance 
 { 
    if (в приложении надо использовать БД MS SQL)
      return MySiteDataProviderMSSQL.Instance;
    else (в приложении надо использовать аксесс)
      return MySiteDataProviderAccess.Instance;
 }
}

static class NewsService
{
    static GetNews()
    {
       return DataProvider.Instance.GetNews();
    }

    static AddNews()
    {
       DataProvider.Instance.AddNews(new New());
    }
}

static class SomeOtherService
{
    static GetTopNewsmakers()
    {
        NewsService.GetNews.GetAuthors();
    }
}


И вот теперь надо одтельно проверить работу логики GetNews(), AddNews() и GetTopNewsmakers(). Создавать базу перед вызовом каждого теста - тесты никто не будет писать, они будут работать по пол часа. Не создавать - непонятно, сколько должен вернуть GetNews на тестовых данных.

На самом деле такую проблему принято решать с помощью Inversion of Control Containers and the Dependency Injection. Например, в решении от MS - Unity - тест будет выглядеть так: Добавляете в NewsService конструктор с параметром IDataGateway, и пользуетесь в сервисе только пришедшим значением. А в коде, юзающем сервис, пишете:
Код

var container = new UnityContainer();
container.RegisterType<INewsService, NewsService>();
container.RegisterType<IDataGateway, TestDataGateway>();

INewsService service = container.Resolve<INewsService>();
service.AddNews();
Assert(service.GetNews().Count =1)


и тут же в соседнем тесте создаете новый контейнер и в нем проводите опыты с настоящим SomeOtherService. А еще в одном тесте - с настоящим DataGateway.

А для реального приложения пишете в конфиг всю структуру классов, и создаете контейнер для каждой операции.


--------------------
PM MAIL WWW   Вверх
mihryak
Дата 14.10.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



elbjarn, такие штуки легко и просто решаются конфигом приложения (например, настройка DbProviderFactory)
или способом PashaPash
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.