Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.04.17;
Скачать: [xml.tar.bz2];

Вниз

Наткнулся на интересное поведение в D2010   Найти похожие ветки 

 
Ega23 ©   (2010-12-27 15:27) [0]


type
 TMyType1 = class (TObject)
 strict private type
   TMyEnum = (meA, meB, meC);
 end;

 TMyType2 = class (TObject)
 strict private type
   TMyEnum = (meA, meB, meC);
 end;


[Error] Unit2.pas(17): E2004 Identifier redeclared: "meA"


 
12 ©   (2010-12-27 15:30) [1]


> Unit2.pas(_17_):

:)


 
Ega23 ©   (2010-12-27 15:32) [2]

Н-да, 5 баллов!
И всё-таки...


 
Kerk ©   (2010-12-27 15:37) [3]

В QC пиши, тут-то какой смысл мусолить.


 
tesseract ©   (2010-12-27 15:41) [4]


> [Error] Unit2.pas(17): E2004 Identifier redeclared: "meA"


Вроде правильно пишет. Надо тип объявить. А то у тебя реально два объекта с одинаковыми идентификаторами.


 
Ega23 ©   (2010-12-27 15:46) [5]


> Вроде правильно пишет. Надо тип объявить. А то у тебя реально
> два объекта с одинаковыми идентификаторами.


Дык они же private, да ещё и strict
Выходит, что для Enum-а это всё равно в unit-scope находится.
Странно.


 
oxffff ©   (2010-12-27 15:48) [6]


> Ega23 ©   (27.12.10 15:46) [5]
>
> > Вроде правильно пишет. Надо тип объявить. А то у тебя
> реально
> > два объекта с одинаковыми идентификаторами.
>
>
> Дык они же private, да ещё и strict
> Выходит, что для Enum-а это всё равно в unit-scope находится.
>
> Странно.


Приветствую.
IMHO QC.


 
Ega23 ©   (2010-12-27 15:52) [7]


> Приветствую.

Взаимно.

> IMHO QC.

Ну вот хотелось бы сначала обсудить, дабы на QC дураком не выглядеть.


 
tesseract ©   (2010-12-27 15:52) [8]


> Дык они же private, да ещё и strict


Имена-то у них не Private и не Strict. Объяви перечисляемый тип и используй как поле. Или компилятор должен на ходу выяснять в момент присваивания какой из перечисляемых типов с одинаковым именем имеется в виду?


 
Kerk ©   (2010-12-27 15:53) [9]


> tesseract ©   (27.12.10 15:52) [8]
>
> Или компилятор должен на ходу выяснять в момент присваивания какой из
> перечисляемых типов с одинаковым именем имеется в виду?

Чего ему выяснять, если у них scope не пересекается?


 
tesseract ©   (2010-12-27 15:58) [10]


> Чего ему выяснять, если у них scope не пересекается?


Выходит область имен у них все-же пересекается. Компилятор назначает каждому перечисляемому типу набор внутренних ID.  При смене ID собственно он и ругается. Баг это или не баг в данном режиме не понятно и чего-бы общий тип не задать тож неясно.


 
Kerk ©   (2010-12-27 16:00) [11]


> tesseract ©   (27.12.10 15:58) [10]
>
> > Чего ему выяснять, если у них scope не пересекается?
>
> Выходит область имен у них все-же пересекается.

Выходит, пересекается. В этом и баг :)


 
oxffff ©   (2010-12-27 16:01) [12]


> Ega23 ©   (27.12.10 15:52) [7]
>
> > Приветствую.
>
> Взаимно.
>
> > IMHO QC.
>
> Ну вот хотелось бы сначала обсудить, дабы на QC дураком
> не выглядеть.


А ты прав.

Довод за QC

У компилятора есть возможность выяснить в текущей области видимости активные определения и их лексемы.

Довод против QC

У компилятора нет возможности выяснить что имел программист под meA.
Либо необъявленный идентификатор, либо действительную активную лексему. То есть что имел ввиду программист TMyType1.meA или TMyType2.meA? Это трудноуловимый момент.


 
tesseract ©   (2010-12-27 16:06) [13]


> Выходит, пересекается. В этом и баг :)


Объявление перечисляемых типов не входят в определение strict и private - это не имена процедур и полей. Они собственно и скрываются и видны не будут. А вот объявление типа будет неявно все равно вынесено - и получается что получается. ID будут пересекаться.


 
oxffff ©   (2010-12-27 16:12) [14]


> tesseract ©   (27.12.10 16:06) [13]
>
> > Выходит, пересекается. В этом и баг :)
>
>
> Объявление перечисляемых типов не входят в определение strict
> и private - это не имена процедур и полей.


Почему не входят. Определение типа включает в себя область допустимых значений констант-лексем, которые действительны в указанной области и которые лишены смысла вне его. IMHO.
То есть встретив выражение MeA можно однозначно установить вид, тип этого выражения.


 
Ega23 ©   (2010-12-27 16:20) [15]


>  и чего-бы общий тип не задать тож неясно.

Ситуация простая. Пишу серию тестов, под каждый - свой парсер, ну, будем считать, HTML-документа.
В конечном итоге, по результатам тестов, останется один парсер.
Соответственно, надо было сделать некое множество HTML-тэгов, встретив которые парсер будет что-то там делать. Выносить это дело "наверх" не хочется, ибо по-идее, это сугубо внутренняя логика парсера.
Ну и получилось. Один парсер, в нём перечислимый тип. Другой парсер, в нём такой же перечислимый тип, только чуть-чуть отличается по набору. У обоих есть TagType ttNone (служебный).
Ну вот и наткнулся на такое поведение.


 
Ega23 ©   (2010-12-27 16:26) [16]


> Почему не входят. Определение типа включает в себя область
> допустимых значений констант-лексем, которые действительны
> в указанной области и которые лишены смысла вне его. IMHO.
>
> То есть встретив выражение MeA можно однозначно установить
> вид, тип этого выражения.


Проверил.

 TMyType1 = class
//  strict private type
//    TMyEnum = (meA, meB, meC);
 strict private const
   c_MyConst = 1;
 end;

 TMyType2 = class
//  strict private type
//    TMyEnum = (meA, meB, meC);
 strict private const
   c_MyConst = 1;
 end;



Всё отлично, всё на ура скомпилялось.


 
tesseract ©   (2010-12-27 16:30) [17]


> Всё отлично, всё на ура скомпилялось.


Дык и должно. Ты не определяешь же константы meA. Попробуй их объявить как приватные константы и запихнуть в Enum. Так должно прокатить при использовании в приватах класса.


 
Ega23 ©   (2010-12-27 16:37) [18]


> Дык и должно. Ты не определяешь же константы meA. Попробуй
> их объявить как приватные константы и запихнуть в Enum.
> Так должно прокатить при использовании в приватах класса.


ээээ...
Я тебя не понял.
Код давай. :)


 
oxffff ©   (2010-12-27 16:42) [19]


> Ega23 ©   (27.12.10 16:26) [16]
>
> > Почему не входят. Определение типа включает в себя область
>
> > допустимых значений констант-лексем, которые действительны
>
> > в указанной области и которые лишены смысла вне его. IMHO.
>
> >
> > То есть встретив выражение MeA можно однозначно установить
>
> > вид, тип этого выражения.
>
>
> Проверил.
>
>  TMyType1 = class
> //  strict private type
> //    TMyEnum = (meA, meB, meC);
>  strict private const
>    c_MyConst = 1;
>  end;
>
>  TMyType2 = class
> //  strict private type
> //    TMyEnum = (meA, meB, meC);
>  strict private const
>    c_MyConst = 1;
>  end;
>
>
>
> Всё отлично, всё на ура скомпилялось.


Все зависит от реализации компилятора. и аналогия не совсем прямая.
Поскольку в данном случае имя является косвенным обращением к значению. В отличии от прямого обращения к значению meA.


 
tesseract ©   (2010-12-27 17:18) [20]

Дуим ду :

  strict private const
   meA = 1;
   meB = 2;
   meC = 3;
 strict private type
TMyEnum = (meA, meB, meC);
   

Это эмпирика, но может прокатить.


 
Alkid ©   (2010-12-27 19:43) [21]

Вопрос на засыпку: а что написано про это в спецификации языка?
;)


 
Alx2 ©   (2010-12-27 21:08) [22]

Ого, как много воды утекло. И это такой Delphi теперь? Аж strict private? Эдакая "частная персональная страница" Еще пяток лет забью на предменую область и совсем все забуду. Зато, наверняка будут монстры типа
strict public privated semiconst
 value : metaExtended extends complex fraction over TCalendar;
:)


 
Ega23 ©   (2010-12-28 00:13) [23]


>  И это такой Delphi теперь?


Давно уже.


 
Юрий Зотов ©   (2010-12-28 00:53) [24]

> У компилятора нет возможности выяснить что имел программист под meA.

А самое интересное то, что через некоторое время программист, глядя на свой же код, даже и сам не сразу поймет где у него какой meA. Вот и спрашивается - а на фига же искать приключения на собственную... голову?


 
Макс Черных   (2010-12-28 02:01) [25]

Юрий Зотов ©   (28.12.10 00:53) [24]
> Вот и спрашивается - а на фига же искать приключения на
> собственную... голову?

Зачем на свою. :) Мну вот как-то замутил некий реорганизационный момент в куче мале всяких юнитов. Ну и объеденил 3 Олегиных модуля в один. И тут-же вот от этих одинаковых констант перечисляемых компилятор и вошел в ступор. Спрашиваю - это чего и для зачем? Ответ - ХЗ, бум посмотреть. :)

Так что неважно, понимает это компилятор или не понимает, но понятность кода от такого дублирования страдает очень сильно. Вывод - так делать не стоит, ИМХО.


 
Германн ©   (2010-12-28 03:22) [26]


> Макс Черных   (28.12.10 02:01) [25]
>
> Юрий Зотов ©   (28.12.10 00:53) [24]
> > Вот и спрашивается - а на фига же искать приключения на
> > собственную... голову?
>
> Зачем на свою. :) Мну вот как-то замутил некий реорганизационный
> момент в куче мале всяких юнитов. Ну и объеденил 3 Олегиных
> модуля в один. И тут-же вот от этих одинаковых констант
> перечисляемых компилятор и вошел в ступор. Спрашиваю - это
> чего и для зачем? Ответ - ХЗ, бум посмотреть. :)

Оригинальная у вас контора. :)
Будь я помоложе...

Не, ну. Должность технического директора у вас не занята?
Точнее она занята и я даже знаю кем. :)


 
Ega23 ©   (2010-12-28 07:57) [27]


>  Ну и объеденил 3 Олегиных модуля в один. И тут-же вот от
> этих одинаковых констант перечисляемых компилятор и вошел
> в ступор.


Я ж тогда тебя спрашивал: объединять в один модуль или разнести по "один компонент - один юнит". Ты сказал: разнеси, если чё - соберём в один.


 
Юрий Зотов ©   (2010-12-28 10:10) [28]

Даже и в случае "один компонент - один юнит" все общие для них типы и константы лучше вынести в отдельный модуль.


 
Ega23 ©   (2010-12-28 10:16) [29]


> Даже и в случае "один компонент - один юнит" все общие для
> них типы и константы лучше вынести в отдельный модуль.


Они не общие были. Они были разные, но у некоторых совпадали названия. Поскольку сидели в разных юнитах (поначалу) - было пофиг. Когда Макс начал их в один переносить - вот тут конфликт и произошёл.


 
Юрий Зотов ©   (2010-12-28 10:51) [30]


> вот тут конфликт и произошёл.

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


 
oxffff ©   (2010-12-28 10:55) [31]


> Когда Макс начал их в один переносить - вот тут конфликт
> и произошёл.


:)


 
DiamondShark ©   (2010-12-28 11:00) [32]

Клиническая картина ясна: разработчики потеряли чувство языка. Из стройного, логичного и компактного, но при этом мощного языка дельфи превратился в чулан Плюшкина, в который понатаскано рухляди по едиственному принципу: "А шоб было".


 
Dimka Maslov ©   (2010-12-28 22:58) [33]


> DiamondShark ©   (28.12.10 11:00) [32]


Никто ведь и не заставляет пользоваться всей этой шнягой. Пока.


 
Макс Черных   (2010-12-29 00:49) [34]


>  разработчики потеряли чувство языка.

Да ну конечно, во всем виноват Путин и ко.
Вот для примера пара кусков кода, аффтор пишет (типа профессионально) более 10 лет:

 if ((SR<>"0")and(Mont="0")and(Obor="0")and(Proch="0"))or
    ((SR="0")and(Mont<>"0")and(Obor="0")and(Proch="0"))or ((SR="0")and(Mont="0")and(Obor<>"0")and(Proch="0")) or ((SR="0")and(Mont="0")and(Obor="0")and(Proch<>"0"))or ((SR="0")and(Mont="0")and(Obor="0")and(Proch="0")) then MultStatRow := false


  if (FormNum=1) or (FormNum=2) or (FormNum=14) or (FormNum=4) or (FormNum=22) or (FormNum=24) or (FormNum=17) or (FormNum=18) or (FormNum=13) or (FormNum=21) or (FormNum=20) or (FormNum=26) or (FormNum=23) or (FormNum=25) then

И виноваты в этом тихом ужасе, вестимо, разработчики, и Б.Гейтс, бо он во всем виноват. И Чубайс, который во всем остальном виноват (С ЕБН).


 
cwl ©   (2010-12-29 01:03) [35]

> аффтор пишет (типа профессионально) более 10 лет:
много он, интересно, такого за 10 лет написал? %>


 
Макс Черных   (2010-12-29 01:11) [36]


> много он, интересно, такого за 10 лет написал?

Дофига. :) Еще один пример (из многих :( ), синтаксис и комментарии гуру сохранены:

function ChangeSeparatorInStr(str: string): string;
var posit, i, l: integer;
   tmp, s: string;
begin
 posit := pos(",", str);
 tmp := str;
 delete(tmp, posit, 1);
 l := length(str);
 if (pos("=", trim(str))=1) then //вроде работает, но...
   for i:=0 to l-1 do
    begin
     s := copy(str, i, 1);
     if s="," then
     begin
       tmp := copy(str, i-1, 1);
       if (tmp<>" ") and ((tmp="0") or (tmp="1") or (tmp="2") or (tmp="3") or (tmp="4") or
         (tmp="5") or (tmp="6") or (tmp="7") or (tmp="8") or (tmp="9")) then
         begin
           tmp := copy(str, i+1, 1);
           if (tmp<>" ") and ((tmp="0") or (tmp="1") or (tmp="2") or (tmp="3") or (tmp="4") or
             (tmp="5") or (tmp="6") or (tmp="7") or (tmp="8") or (tmp="9")) then
           str[i] := ".";
         end;
     end;
    end;
 Result := str;
end;


 
Германн ©   (2010-12-29 03:23) [37]


> Макс Черных   (29.12.10 00:49) [34]
>
>
> >  разработчики потеряли чувство языка.
>


> Макс Черных   (29.12.10 01:11) [36]
>
>
> > много он, интересно, такого за 10 лет написал?
>
> Дофига. :) Еще один пример (из многих :( ), синтаксис и
> комментарии гуру сохранены:

А просто навести порядок в своем собственном коллективе, разработать общие нормы для кода что помешало?
Отсутствие нормального технического директора, ИМХО".

Хороший ГенДир - это главное. Без него вообще ничего не будет. Но и без хорошего "технического директора" не обойтись фирме, которая предлагает свои разработки.


 
TUser ©   (2010-12-29 04:37) [38]

> Макс Черных   (29.12.10 01:11) [36]

Олег не мог такого написать, явно с тырнета скопипастил, халявщик.


 
Ega23 ©   (2010-12-29 08:06) [39]


> Олег не мог такого написать

Не-не-не, я так не умею, это не я.
Когда я только на работу пришёл, меня парни напугали кодом этого товарища. Тот на порядок круче приведённого был.


 
TUser ©   (2010-12-29 08:09) [40]

IncDay - тоже его произведение?



Страницы: 1 2 3 4 вся ветка

Форум: "Прочее";
Текущий архив: 2011.04.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.005 c
15-1293744604
Юрий
2010-12-31 00:30
2011.04.17
С днем рождения ! 31 декабря 2010 пятница


3-1256535483
JohnLemon
2009-10-26 08:38
2011.04.17
Помогите с SQL запросом....


2-1294828261
Студент
2011-01-12 13:31
2011.04.17
Насколько я неправильно использую SetLength?


2-1294996660
tippa
2011-01-14 12:17
2011.04.17
убрать значек с панели задач, само окно оставить


2-1295103406
Pcrepair
2011-01-15 17:56
2011.04.17
Разработка и модификация компонентов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский