Re[14]: Структура внутри функции
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.05 00:04
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Pavel Dvorkin, Вы писали:


S>Простая группировка переменных достигается вообще безо всяких структур. Вот так:


S>
S>#region Device Parameters
S>IntPtr handle;
S>int timeout;
S>DeviceControl controlWord;
S>#endregion

S>#region Math stuff
S>double integralTemp;
S>double upperBound, lowerBound;
S>double sensitivity;
S>#endregion
S>


Скажу больше. Это тоже плохой С-шный стиль (именно С-шный, а не С++-ный). Переменные лучше объявлять при их первом использовании. Тогда и места меньше нуно, и яснее их назначение, и вероятность оставить ее неинициализированной существенно уменьшается (хтя это уже в C# сделать крайне сложно вообще).

S>Ты математику учил? Тензор — это не просто несколько цыферок записанных в табличку. Это математический объект, описываемый своими компонентами. И это компоненты обязаны вести себя определенным образом при смене системы координат.


S>Точно так же и структура — это сущность, компоненты которой ведут себя согласованно. С точки зрения ООЯ это объект.


Полностью согласен с предыдущим аратором.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Структура внутри функции
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.05 00:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>. А всех, кто с принципом "ООЯ доведенный до предела" не согласен — в ад!


Нет. Те используют языки ориентированные на процедурное/функциональное программирование. Ты же выбрал язык который просто не удобен для не ОО-кодирования.

Ну, а я так считаю, что половинчатые решения вроде описанного тобой (когда структура создается, но обрабатывающий код остается внешним) — это в первую очередь удар по абстракции, а значит ухудшение восприятия кода. Представь себе если бы вместо мат.-операций над матрицами пришлось бы использовать (а главное читать) голый код оперирующий с ихними членами. Зачем такая каша когда есть методы и операторы?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Структура внутри функции
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.05 00:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Хм, а как же тогда в managed C++ можно структуры внутри функций описывать ? Тут кто-то сказал, что можно. Или нельзя все же ?


Там и функции глобальные описать можно. Проблема только в том, что их никто не поймет. А еще там влет можно пройтись по памяти или вызвать переполнение буфера.

При разработке C# ставилась цель создать язык общего назначения который будет в первую очередь безопастным, во вторую простым, в третью объектно ориентированным. Задачи сдирания всего что есть в С++ не входило. По этому получился язык только синтаксически похожий на С++. Применять его унжно совсем по другому. Но если научиться его применять как надо, то очень вероятно, что С++ начнет со временем вызвать тошному. Я тому живой пример.

В общем, нужно понять, что нужно просто погрузиться в Шарп. Проблемы которые ты испытывашь — это проблемы человека меняющего привычки. Даже если привычка вредная отказаться от нее не просто. Одако отказавшись от нее ты осознашь, что выиграл от этого.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Структура внутри функции
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.05 00:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>В .Net классы есть некоторая сущность эпохи рантайма, и довольно серьезная сущность. Если же оставить .Net в стороне и рассматривать unmanaged код, то в нем классы в рантайме или вообще не существуют (C++ без RTTI), либо ограниченно существуют (C++ с RTTI, Object Pascal). А поскольку C# специально заточен под .Net, MS и сделала в нем такое ограничение. Вот в этом и причина, а не в идейных соображениях. С С++ она такое сделать не могла — язык ей не принадлежит .


Это то объяснение которое тебе хочется видеть. Тут вот рядом был флэймец с ВБ-шниками которые в упор отказывались понимать (а точнее, как ты, принимать) то что в C# нет индексированных свойств и дефолтных свойств. Аргументация была в точности противоположенная твоей. Мол "в MSIL-е же индексированные свойства есть, и индексатор C#-а превращается при компиляции в нег, значит индексированные свойства есть в C#". Пролодление было уже в твоем духе (только еще и в хамской манере). "...он явно он их не дает сделать потому что C# фуфло!". Вот така логика.

PD>Ну а правильно это или нет — будущее покажет.


Да уже показало. Для всех кто покончил с настальгией по тараканам С++ подобные штуки проблемой не являются. Даже ярые апологеты С++ вроде ПК находят куда более тонкие (и надо признать порой не безосновательные) претензии в C#.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Структура внутри функции
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.05 02:01
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Видишь ли, в шарп не стали вносить все, что "не помешает".


Золотые слова. И вообще законченная вещь — это ни когда нечего больше добавить, а когда нечего больше отнять (с) кто-то мудрый.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Структура внутри функции
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.05 02:01
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Sinclair, не стоит передергивать. Нигде я такого не говорил. Это просто практика всех, кто писал раньше на C++/Pascal. Об этом в любом учебнике по этим языкам написано. И то, что в С# этого нет, еще не означает, что это неверно. C# и .Net еще не все программирование .


Я тоже писал на C++/Pascal, и Синклер писал. Но почему-то желания получить локальные классы не имеем.

Я бы еще согласился бы если поступило предложение ввести некие дополниельные оласти видимости в которых можно было бы собирать нечто относящееся к реализации некоторого метода. Ну, нечто вроде вложенных функций в Pascal-е, но без функций. Ведь, как правильно заметил Синклер, функция на 500 строк это жуть и мрак.

Кстати, почему тебя не напрягает отсуствие в С++ возможнсоти создать вложенную функцию? Ведь в Паскале это есть, и никого это не напрягает?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Структура внутри функции
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.09.05 11:15
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Все это интересно в данной функции. За пределами этой функции такая структура никому не нужна, да и вообще желательно, чтобы о ней никто не знал, потому как дело это сугубо внутреннее для этой функции. А получается, что сделать такое невозможно.


Специальная структура только для одной функции? Сдается мне, что функционал этой функции перегружен. А если еще будет такая внутренняя структура, то эту функцию отрефакторить как следует будет нельзя.
... << RSDN@Home 1.2.0 alpha rev. 615 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[12]: Структура внутри функции
От: Павел Кузнецов  
Дата: 25.09.05 06:16
Оценка:
Sinclair,

> Ты не мог бы пояснить подробнее причины прятать структуру от остальных? Я вижу две проблемы:

> 1. Есть риск конфликта имен.

И это тоже. Особенно актуально в больших проектах с долгим временем жизни, где разработка ведется в параллельных ветках SCM и т.п.

> 2. Есть риск того, что кто-то использует структуру без твоего ведома.

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

Например, может прятаться конкретный класс при реализации одного из вариантов factory method. В случае, если конкретный класс определяется внутри порождающей функции, мы видим, что никто точно не лезет к деталям реализации конкретного класса, т.к. вынужден работать через базовый интерфейс. В случае, если конкретный класс определен "вовне", нужно так или иначе дополнительно заботиться о локализации доступа к нему. Впрочем, наверное, т.к. в C# нет "свободных" функций, это не так актуально, т.к. там вместо функции в обсуждаемом варианте:
auto_ptr<AbstractProduct> create_product()
{
   class ConcreteProduct : public AbstractProduct
   {
     . . .
   };

   return auto_ptr<AbstractProduct>( new ConcreteProduct );
}

наверное, сразу будет сделан специальный класс:
public class ProductFactory
{
   private class ConcreteProduct : AbstractProduct
   {
     . . .
   }

   public static AbstractProduct create_product()
   {
     return new ConcreteProduct();
   }
}
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Структура внутри функции
От: Аноним  
Дата: 26.09.05 06:10
Оценка:
_>2 Автор
_>Используй C#3 Там есть неименованные структуры
Нет там никаких анонимных структур. Пока что анонимные типы выраждаются в классы.

Мда, действительно.

А что будет в релизе вообще не ясно.

Само собой

_>Возвращай Hashtable, если возможно


Звучит дико. А не мог бы ты обосновать такое редложение?

Ну если человеку очень хочется сгруппировать несколько переменных. Почему бы их не сгруппировать в Hashtable

А вообще, конечно верно, что:

Поясняю. Ты пытаешся программировать на ООЯ не объектно-ориентированными методами. Отсюда и проблема. Не думай о структуре как о средстве сгриппировать переменные. Думай о ней как об объекте со своим состоянием, поведением и т.п.
А если тебя вдруг тянет банально объеденить две переменные, то нужно останавливаться и возвращаться к дизайну системы. Переменные ведь не просто так связаны. Скорее всего они являются частью состояние некой более абстракной сущности....



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Структура внутри функции
От: Left2 Украина  
Дата: 27.09.05 13:26
Оценка:
В С++ такое допустимо — вот только толку от этого мало, поскольку такая структурка не может быть параметром шаблона
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Структура внутри функции
От: Павел Кузнецов  
Дата: 27.09.05 14:23
Оценка:
Здравствуйте, Left2, Вы писали:

L> В С++ такое допустимо — вот только толку от этого мало, поскольку такая структурка не может быть параметром шаблона


Это поправимо в следующей версии спецификации. Жаль только, что темп работы комитетчиков столь нетороплив...
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Структура внутри функции
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 01.10.05 06:57
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это поправимо в следующей версии спецификации. Жаль только, что темп работы комитетчиков столь нетороплив...


А в C++/CLI?
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[9]: Структура внутри функции
От: anton_t Россия  
Дата: 01.10.05 08:03
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, MatFiz, Вы писали:


MF>>С другой стороны, это не дает тебе писать в плохом стиле, когда тело функции занимает несколько экранов и в связи с этим нефтыкаемо методом окидывания взглядом.


PD>Не хочу я писать в плохом стиле. Я наоборот хочу в хорошем писать


PD>Ситуация. Пишу я функцию. В ней штук 10 переменных, описывающих некоторый внутренний для этой функции объект (слово объект в общечеловеческом смысле, а не в смысле языка). В соответствии с правилами хорошего стиля стоит из них создать структуру, чтобы обращаться к этим переменным как к некоторому единому целому. Ну хоть скопировать их все в другой набор таких же переменных (для другого объекта).


PD>Все это интересно в данной функции. За пределами этой функции такая структура никому не нужна, да и вообще желательно, чтобы о ней никто не знал, потому как дело это сугубо внутреннее для этой функции. А получается, что сделать такое невозможно.


Ну так и опиши эту функцию как класс с методом. А внутри этого класса определи структуру.
Re[4]: Структура внутри функции
От: Павел Кузнецов  
Дата: 04.10.05 16:18
Оценка:
Здравствуйте, AndrewVK, Вы писали:

ПК>>Это поправимо в следующей версии спецификации. Жаль только, что темп работы комитетчиков столь нетороплив...


AVK>А в C++/CLI?


Только в C++/CLI это делать будет странно: ничего специфического для CLI в этой возможности нет. Данная возможность с разработчиками VC++ еще не обсуждалась, но я планирую сделать это в ближайшее время.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Структура внутри функции
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.10.05 19:38
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Только в C++/CLI это делать будет странно


Ничего странного. С++/CLI, в отличие от С++, на комитет не подвязан и менять его значительно проще.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[6]: Структура внутри функции
От: Павел Кузнецов  
Дата: 06.10.05 03:20
Оценка:
AndrewVK,

> ПК> Только в C++/CLI это делать будет странно

>
> Ничего странного. С++/CLI, в отличие от С++, на комитет не подвязан и менять его значительно проще.

VC++ тоже к комитету не подвязан, и менять его ничуть не сложнее, чем C++/CLI. Точнее даже, ровно так же менять, даже в одном и том же месте, и даже одними и теми же разработчиками
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[17]: Структура внутри функции
От: bazilxp  
Дата: 11.10.05 07:08
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Sinclair, Вы писали:


PD>Честно сказать, мне эта дискуссия порядком надоела. Теперь уж точно в последний раз. Времени нет на эти пустопорожние споры.


PD>>>Sinclair, не стоит передергивать. Нигде я такого не говорил. Это просто практика всех, кто писал раньше на C++/Pascal. Об этом в любом учебнике по этим языкам написано.

S>>Что именно написано?

PD>Почитай сам любой учебник.


PD>>>Ну нет так нет. Только одно добавим — в Шарпе нет. Потому как в других языках есть и используется.

S>>Приведи причину.

PD>Там она и приводится.



S>>Да, совершенно верно. Тут вообще надо все рефакторить нафиг.


PD>Успехов!


PD>>>В моем примере — не думаю

S>>А я тебе говорю. Сам видел совершенно аналогичный код. Отлаживаться — очень трудно.

PD>>>Ну что же, вот тебе пример. Порежь. Не буду возражать даже, если ты из этой функции 20 сделаешь. И размер у них небольшим совсем будет. Только тогда структуры A,B и т.д. неплохо бы внутри каждой из этих 20 функций соответственно и описать, а не выносить в класс.

S>>Примера пока нету. Есть некоторые намеки на его структуру. По ним я нутром чувствую, что как раз в данном случае я бы вообще разнес это на 20 классов.

PD>Прекрасно. 20 классов, несколько десятков свойств и методов, интерфейс между ними и т.д. 30 сотраниц документации потом. И все это ради того, чтобы 20 структур сформировать и на устройство отправить.

PD>Может, это все и верно, может, именно так и надо сейчас. Не знаю. Но если это именно так — неудивительно, что все это потом работает очень медленно , а памяти ест немеряно. Зато принципы ООП тут полностью в порядке.

Тебе бы Рихтера не мешало бы почитать на предмет типов .NET , а по поводу кода и некоторых советов не обязательно на 100% верных С. Макконнел "Совершенный код" ....


PD>>>Опять передергивание. Я же четко сказал — "в некотором смысле". Т.е. они существуют в рантайме, имеют свои поля (static members) и т.д. Я же не утверждаю, что тип есть переменная в C#.

S>>Это уже радует.

PD>Я тоже рад, что ты это наконец понял.


PD>>>Кстати, в Object Pascal я это вполне могу утверждать — там есть переменная типа тип, даже с наследованием.

S>>Нет, не можешь. Ты вообще путаешь понятия тип и переменная. Переменная — это экземпляр типа. В Delphi есть семейство типов для метаклассов. Никакого отношения к переменным оно не имеет. Ни в каком смысле.

PD>Опять двадцать пять. Я эе , кажется, ясно дал понzть, что говоря о типе, я имею в виду то, что это нечто, существующее в рантайме. Ты их называешь переменными метаклассов я — типами как переменными — от этого суть не изменится. Может, я не совсем точный термин употребил, но понять ИМХО можно было. Или ты впрямь думаешь, что я после 25 лет программирования определение (тип) от куска памяти (переменная) отличить не могу ?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.