Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454

Как упростить громоздкий синтаксис?

26.06.2014, 19:15. Показов 3180. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я понимаю, что это ООП ради ООП. Это моя первая программа, поэтому мне хочется задействовать полиморфизм, наследование, инкапсуляцию.
Вот упрощенный кусок моей библиотеки.
Базовое пространство имён.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace Base
{
    public abstract class Weather
    {
        public string Description { get; protected set; }
        public virtual Location location { get; protected set; }
 
        public abstract bool GetWeather(string locationPath, string weatherPath);
    }
    public class Location
    {
        public string Woeid { get; protected set; }
        public string Latitude { get; protected set; }
        public string Longitude { get; protected set; }
 
        public Location() { }
    }
}

в двух словах: есть пространство имён с базовыми классами.есть другое пространство имён с переопределёнными классами и из-за этого переопределения мне приходится повторно определять поля (override).но это не беда.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
namespace Yahoo
{
    public class Weather : Base.Weather
    {
        private Location YLocation;
        public override Base.Location location
        {
            get { return YLocation; }
            protected set { YLocation = (Yahoo.Location)value; }
        }
        public override bool GetWeather(string lPath, string wPath = "")
        {
            if (!YLocation.GetLocation(lPath))   //здесь ладно, можно использовать переменную напрямую, дабы не приводить свойство
            {
                return false;
            }
            /**/
 
            return true;
        }
        public Weather()
        {
            location = new Location();
        }
    }
    public class Location : Base.Location
    {
        protected string locationPath;
        
        public bool GetLocation(string locationPath)
        {
            LocationPath = locationPath;
            LocationXml = new XmlDocument();
            /**/
            return true;
        }
    }

самый ад будет при использовании сего чуда.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
private Yahoo.Weather weather;
public void CityChanged(object sender, KeyEventArgs e)
{
      if (e.Key == Key.Return)
      {
            ((Yahoo.Location)weather.location).GetLocation("бла бла");
      }
}

и таких полей десяток, в каждом из которых по многу добавленных свойств (много переопределенных классов вроде Location). И везде это приведение. Синтаксис выглядит ужасно громоздким. Пробовал я создавать переменные нужного типа и присваивать приведенные поля (всё-таки классы- ссылочный тип), но там много полей почему-то null. есть простой выход - не определять в базовом классе поля переопределяемых классов, но смысл тогда в наследовании? есть в си шарп способ преодолеть эту громоздкость при следовании принципам ООП(я всё-таки не теряю надежды написать хороший ОО код)?

Добавлено через 8 минут
Надо добавить, что я не помню всегда, где что переопределено и добавлено, таким образом часто, уже написав код, вижу ошибку и горожу это приведение. очень раздражает.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.06.2014, 19:15
Ответы с готовыми решениями:

Как перевести синтаксис макроса VBA (Excel) в синтаксис Visual FoxPro
Здравствуйте! Скажите пожалуйста, как перевести синтаксис записанного макроса в excel в синтаксис FoxPro? Нужно, чтобы из FoxPro...

Как перевести синтаксис Intel в синтаксис AT&T? (ассемблерная вставка в СИ)
Извиняюсь, что, возможно, пишу не в ту тему. Нужен именно AT&T синтаксит. В качестве примера для курсовой я разбираю перемножение...

Слишком громоздкий цикл
Добрый день, господа форумчане! Я сейчас работаю с чужим кодом, анализируя его, и все бы хорошо, но вот есть вот такой проблемный участок...

33
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.06.2014, 19:18
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
есть в си шарп способ преодолеть эту громоздкость при следовании принципам ООП
А вы саму цель сих действий расскажите...
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
26.06.2014, 19:25  [ТС]
insite2012, что именно? писать программу именно так или зачем проще обращаться к переменным?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.06.2014, 19:26
Уточню. Что за программа и что должна делать.
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
26.06.2014, 19:28  [ТС]
insite2012, на данный момент это парсеры погоды. есть несколько пространств имён, названных соответственно поставщикам. в каждом некоторые классы переопределяются сообразно информации, предоставляемой поставщиками.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.06.2014, 19:32
tramp_1-3, я так понял, несколько поставщиков, у каждого одинаковые (по названию, но с разной реализацией) методы. Я вас верно понял? Об использовании интерфейсов не думали?
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
26.06.2014, 19:35  [ТС]
insite2012, там в основном не методы, а поля (WPF к ним привязывается). Интерфейсы с полями вроде бы не очень дружат. Кусок очень упрощён, на нём виден только метод. А наряду с ним там много добавленных полей во многих классах.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.06.2014, 19:38
tramp_1-3, я почему-то вижу больше свойств и методов, чем полей)))
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
26.06.2014, 19:39  [ТС]
insite2012, аа, да, я их путаю. в свойствах дело.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.06.2014, 19:40
tramp_1-3, свойства и поля - разные вещи. Свойства можно определять в интерфейсе.
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
26.06.2014, 19:45  [ТС]
Psilon, я знаю, что разные. всё запомнить не могу, что есть что. а как это будет выглядеть? вместо классов интерфейсы Astronomy, Wind, Units, Location и т.д.? не совсем понимаю.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.06.2014, 19:56
tramp_1-3, на самом деле тупо поменяв классы на интерфейсы лучше не станет, это раз Во-вторых, название интерфейса принято начинать с буквы I, то есть в вашем случае будет IAstronomy, IWind и так далее.

Если получается громоздко, значит косяк в архитектуре У меня та же фигня была не один раз, правда, иногда понимание, что же было не так, приходит спустя месяцы и даже больше, с опытом.

Сформулируйте, что вы хотите, нарисуйте иерархию классов на бумажке, продумайте все хорошенько, а потом только садитесь кодить Наследование - не серебрянная пуля.
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
26.06.2014, 20:06  [ТС]
Psilon, в том то и дело, что с иерархией всё хорошо. в наследовании большого смысла нет здесь, просто хочется написать хороший ОО код. меня всё в программе устраивает, кроме этого чудовищного приведения. переопределение классов в пространствах имён поставщиков - логичнее я ничего не придумаю. просто думал, что в си шарп есть какой-нибудь трюк, чтобы это приведение бесконечное избежать.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.06.2014, 20:56
tramp_1-3, классы для всех поставщиком должны наследоваться от одного и того же класса (или интерфейса), через который и должно происходить взаимодействие. Приведение тут вообще ни к чему. Еще раз - вы архитектуру не понимаете, а мы её просто не знаем Поэтому получается фигня.
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
27.06.2014, 03:14  [ТС]
Psilon, у меня всё так, как вы сказали свойства переопределяю, чтобы они соответствовали тем классам, что определены в этом же пространстве имён. и для доступа ко всему, чего нет в базовых классах приходится приводить. я могу показать исходники, но я уже убрал большинство объявлений из базового класса, ибо задолбало..
https://onedrive.live.com/redi... lder%2c.cs

Добавлено через 3 минуты
Psilon, не подумайте, что я - любитель костылей это для меня больше обучение, чем попытка написать идеальную программу, вот я пытаюсь понять, как строить логику приложения.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.06.2014, 12:23
tramp_1-3, если бы вы были любителем костылей, я бы просто отписался от темы, поверьте

//большинство из этого должно быть объявлено в базовом классе, чтобы наследование имело смысл
ну давайте разберем, что мешает это поместить в базовый класс? Я про класс Yahoo в данном случае.
Вообще, в чем разница между сервисами?.. У вас реально дофига общего кода. Что посоветовать - рефакторите. То есть перемещайте свойства, поля, методы в базовый класс до тех пор, пока они используются везде. ТО есть refactor -> pull member up Сходу можно увидеть, что можно безболезненно 90% кода в базовый класс положить Только это довольно муторно, и нужно весь проект на руках иметь, потому что могут быть нюансы) Например, что вам мешает вот это:
C#
1
2
3
4
5
6
7
8
9
        public XDocument WeatherXml { get; protected set; }
        public Condition condition { get; protected set; }
        public Provider provider { get; protected set; }
        public Yahoo.Location location { get; protected set; }
        public Units units { get; protected set; }
        public Wind wind { get; protected set; }
        public Atmosphere atmosphere { get; protected set; }
        public List<Forecast> forecast { get; protected set; }
        public EventHandler<EventInfo> DownloadFailed;
поместить в базовый класс целиком и удалить из производных?
1
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
27.06.2014, 17:16  [ТС]
Psilon, то самое, почему я создал тему. вспомогательные классы имеют свои версии в разных пространствах имён, и поэтому придётся всё время всё приводить.
то есть вместо
C#
1
weather.location.Admin1;
мне придётся писать
C#
1
((Yahoo.Location)weather.location).Admin1;
это, конечно, мелочь, но встречается очень часто. завтра попробую снова перелопатить всю свою библиотеку, отпишусь.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.06.2014, 18:30
tramp_1-3, какие свои версии? XDocument у каждого свой? или Provider?

Весь интерфейс вазимодействия должен быть вынесен в базовый класс. Никаких приведений в коде вообще быть не должно. Стремитесь к этому - и избавитесь от дублирования же.
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
27.06.2014, 21:02  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Никаких приведений в коде вообще быть не должно. Стремитесь к этому - и избавитесь от дублирования же.
да как не должно? я же не для удовольствия это делаю, иначе новых членов он просто не увидит.

Добавлено через 2 часа 25 минут
Psilon, в смысле в библиотеке, где все эти парсеры, приведения в впрямь не будет. оно будет уже при использовании..
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.06.2014, 22:35
tramp_1-3, у вас должна быть такая схема, то есть все взаимодействие - через базовый класс.
Изображения
 
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2014, 22:35
Помогаю со студенческими работами здесь

Оптимизировать громоздкий код потока
Значит написал такой громозкий (но рабочий код) потока и загрузки в поток из Тстринг-листа, можно ли его как оптимизировать? Или может...

Упростить, восстановить и упростить, и найдти множество предикатов
Помогите сделать задания, сам слабо понимаю как это делать, смог только по таблицам истинности сделать задания 1,2, а эти тоже сделать...

Синтаксис запросов vs. синтаксис методов
Занимаюсь изучением LINQ'a, и возник вопрос, как переписать следующий запрос IEnumerable&lt;int&gt; numbers = Enumerable.Range(3,...

Как показать синтаксис
Я пишу программу что то типо notepad++ и мне нужно что бы выделялся синтаксис HTML хотя бы открывающих и закрывающих тегов весь код пишется...

Как понять синтаксис a=b|c;
Сейчас разбираюсь в установках принтера и напоролся на такое присвоение значения: pdm-&gt;dmFields = pdm-&gt;dmFields | DM_PAPERSIZE; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru