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

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

26.06.2014, 19:15. Показов 3378. Ответов 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
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
28.06.2014, 09:01  [ТС]
Студворк — интернет-сервис помощи студентам
Psilon,В Base.Weather включен экземпляр Base.Location. В Yahoo.Weather он переопределен таким образом
C#
1
2
3
4
5
public override Base.Location location
        {
            get { return YLocation; }
            protected set { YLocation = (Yahoo.Location)value; }
        }
то есть при обращении возвращается всё равно экземпляр Base.Location, ибо сигнатуры должны быть одинаковыми. слово new мне сразу отсоветовали использовать.

В Yahoo.Location есть члены, которых нет в Base.Location. Вот тут и нужно приведение.. И таких классов, как Location много, и членов таких тоже. Это не страшно, просто я думал, что это дело можно упростить - синтаксис сильно загромождает.

Добавлено через 7 минут
И, по-моему, в XAML вновь добавленные члены тоже не видны, которых в базовом классе нет. Могу ошибаться.

Добавлено через 10 минут
Цитата Сообщение от Psilon Посмотреть сообщение
какие свои версии? XDocument у каждого свой? или Provider?
в одном XDocument, в другом XmlDocument - хотел опробовать Linq to xml, а пространства имён Yahoo он не переваривает, пришлось по-другому. Provider имеет статическое свойство, которое в каждом пространстве имён своё, его вроде бы уже не переприсвоить, хотя дело не в Provider, а в том, что таких классов как Provider много, и там различия немного существенней - взять тот же Yahoo.Forecast и Yahoo.Atmoshpere.

Добавлено через 3 часа 36 минут
Psilon, поменял содержимое Base и Yahoo. Ну как, теперь Ъ ООП?
папка v2
https://onedrive.live.com/redi... =folder%2c
0
28.06.2014, 12:10

Не по теме:

Цитата Сообщение от tramp_1-3 Посмотреть сообщение
я всё-таки не теряю надежды написать хороший ОО код
а тем временем https://dotnetfiddle.net/3lbIw9 :)

0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.06.2014, 12:17
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
В Yahoo.Location есть члены, которых нет в Base.Location. Вот тут и нужно приведение.. И таких классов, как Location много, и членов таких тоже. Это не страшно, просто я думал, что это дело можно упростить - синтаксис сильно загромождает.
нет, это плохо. Все нужное поведение нужно иметь в базовом классе. Повода, почему что-то должно быть в производном - нет.

Добавлено через 2 минуты
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
И, по-моему, в XAML вновь добавленные члены тоже не видны, которых в базовом классе нет. Могу ошибаться.
WPF самый ущербный проект МС в плане архитектуры. Хотя даже там через базовый класс можно изменить, например, тэги всех контролов на форме, не приводя каждый к своему типу.

В вашем случае наследование вообще не используется. Как-то слишком много кода вообще для такой простой задачи...

pycture, F# неплох, сразу его узнал Правда, сначала думал это не он, т.к. нигде нет |> ignore
1
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
28.06.2014, 12:58  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Все нужное поведение нужно иметь в базовом классе. Повода, почему что-то должно быть в производном - нет
а как зачем тогда наследование, если всё запихнуть в одно место? хоть и незначительно, но от пространства к пространству члены там изменяются. в этом и была соль этих вспомогательных классов, что у каждого поставщика они свои.
да, я искусственно усложнил задачу, чтобы научиться. надо сказать, что многое понял и узнал о объектно-ориентированном подходе.
думаете много? рефакторил как мог, там же парсеры в основном. загляните ещё раз в ту папку v2, теперь базовый класс реально базовый, вроде всё дописал как надо.

Добавлено через 5 минут
Цитата Сообщение от pycture Посмотреть сообщение
а тем временем https://dotnetfiddle.net/3lbIw9
впечатляет! благодаря CTS его вполне можно прикручивать много куда

Не по теме:

так недолго стать одним из считанных программистов на хаскеле :good:

0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.06.2014, 13:14
tramp_1-3, так функциональщина неплоха же.

смысл ООП - в разном поведении при одном интерфейсе Полиморфизм, говоря проще.
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
28.06.2014, 13:31  [ТС]
Psilon, Вам по душе конечная версия моего кода? улучшил как мог.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.06.2014, 13:45
tramp_1-3, ну уже лучше, хотя все еще можно половину выкинуть, вынеся в базовый класс

Ну да ладно. Давайте с простого. Зачем вы в данном месте приводите таким образом:
C#
1
(!(((Yahoo.Location)location).GetLocation(lPath)))
почему нельзя написать просто:
C#
1
(!(location.GetLocation(lPath)))
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
28.06.2014, 13:50  [ТС]
Psilon, потому что в базовом такого метода нет. это я так абстрагировался, ведь когда изначально писал ещё не знал, что буду таким образом получать местоположение, думал просто хранить инфу. потом решил так оставить, намеренно не стал под одного поставщика затёсывать. метод, пожалуй, можно и добавить.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.06.2014, 14:08
tramp_1-3, ну добавь абстрактный метод/свойство, для этого-то они и нужны

Добавлено через 55 секунд
C#
1
public abstract string GetLocation(string path);
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
28.06.2014, 14:11  [ТС]
Psilon, тогда придётся и класс абстрактным делать. ну да ладно. это в общем мелочь. что ещё не так?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.06.2014, 14:13
tramp_1-3, да в этом все дело весь интерфейс (а этот метод это часть интерфейса) должны быть в базовых классах. Ну и конечно они должны быть абстрактными, раз уж ничего не умеют делать, без специализации.
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
28.06.2014, 15:46  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
весь интерфейс (а этот метод это часть интерфейса) должны быть в базовых классах
кажется, я наконец-таки вас понял.
но от этого не легче. куда же деть различающуюся реализацию? вот например в WorldWeatherOnline я имею
C#
1
2
3
4
5
public class Atmosphere : Base.Atmosphere
    {
        public int Cloudcover { get; protected set; }
        public double PrecipMm { get; protected set; }
     }
в то же время в Yahoo
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Atmosphere : Base.Atmosphere
    {
        public int Rising { get; protected set; }
        public string RisingText { get; protected set; }
        public static Dictionary<int, string> RisingCodes;
        static Atmosphere()
        {
            RisingCodes = new Dictionary<int, string>();
            RisingCodes.Add(0, "устойчиво");
            RisingCodes.Add(1, "поднимается");
            RisingCodes.Add(2, "падает");
        }
    }
вы умно и складно говорите, но куда деть эти детали?

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

Решение

tramp_1-3, можно просто сделать свойство типа AdditionalDetails, куда это складывать. По-моему вы вообще очень все усложняете У вас все классы могут просто возвращать Dictionary<string,string>, и все.
C#
1
2
3
4
5
6
7
public class Atmosphere : Base.Atmosphere
{
   protected override Dictionary<string,string> GetDetails()
   {
      return Dictionary<string,string> { {"RisingText", RisingText}, {"RisingStatus", RisingCodes[Rising]} }
   }
}
я складно говорю, но в обтекаемых формулировках, потому что нужно много разбираться в этом, а со временем беда
0
 Аватар для tramp_1-3
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
28.06.2014, 15:55  [ТС]
Psilon, ни в коем случае Вас не упрекаю, а только благодарю за неоценимую помощь самоучке
я вроде бы по книжкам всё делаю, подражаю тем простеньким примерам, реальность всегда суровей.
Вы предложили интересный вариант, я ещё сам постараюсь придумать что-нибудь, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2014, 15:55

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

Упростить, восстановить и упростить, и найдти множество предикатов
Помогите сделать задания, сам слабо понимаю как это делать, смог только по таблицам истинности сделать задания 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; ...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru