OberonCore https://forum.oberoncore.ru/ |
|
Отсутствие защиты от опечаток в методах при наследовании https://forum.oberoncore.ru/viewtopic.php?f=22&t=6678 |
Страница 1 из 2 |
Автор: | budden [ Воскресенье, 22 Ноябрь, 2020 11:45 ] |
Заголовок сообщения: | Отсутствие защиты от опечаток в методах при наследовании |
Код: MODULE ОпечаткаПриНаследовании; IMPORT KernelLog; TYPE Родитель = OBJECT PROCEDURE Печатай; BEGIN KernelLog.String("Родитель"); KernelLog.Ln END Печатай END Родитель; TYPE Дитя* = OBJECT (Родитель) PROCEDURE Печатаи*; BEGIN KernelLog.String("Дитя"); KernelLog.Ln END Печатаи END Дитя; VAR р : Родитель; д : Дитя; PROCEDURE Жми*; BEGIN NEW(д); р := д; р.Печатай END Жми END ОпечаткаПриНаследовании.Жми ~ Без ключевого слова override программист не защищён от опечаток при перекрытии унаследованных методов. Хорошо ли это? Не знаю, как это в других (или "настоящих") оберонах. |
Автор: | Sergej Durmanov [ Воскресенье, 22 Ноябрь, 2020 12:34 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Я даже не буду читать такой код. |
Автор: | Илья Ермаков [ Воскресенье, 22 Ноябрь, 2020 13:22 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
В КП для этого есть атрибут NEW у методов, вводящихся впервые. |
Автор: | Sergej Durmanov [ Воскресенье, 22 Ноябрь, 2020 13:33 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Я предлагал Феликсу ввести модификатор { OVERRIDE }, но пока никаких изменений нет. |
Автор: | Comdiv [ Воскресенье, 22 Ноябрь, 2020 13:42 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
budden писал(а): Без ключевого слова override программист не защищён от опечаток при перекрытии унаследованных методов. Напоролись?
|
Автор: | budden [ Воскресенье, 22 Ноябрь, 2020 13:56 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Пока не напоролся, но должен, в связи с движком перевода кода на русский. Я разбил работу на модули, что выглядит весьма естественным. Но при этом одноимённость метода в предке и потомке обязательно нарушается - я ведь перевожу не все модули сразу, значит, я переведу потомка, а предок останется со старым именем, или наоборот. После этого всё прекрасно скомпилируется и не будет работать. Ну и в целом неважно, напоролся ли лично я. Компилятор должен защищать от таких опечаток, это ещё важнее, чем статическая типизация. Если язык позиционируется как надёжный, то отсутствие в этой части защиты от опечаток для меня выглядит явным дефектом, просто я хотел сверить часы. Похоже, что придётся вводить override. Вводить new не вижу большого смысла, потому что далеко не все методы прекрываются. Соответственно, из той идеи, что умолчанию желательно быть наиболее часто используемым вариантом, лучше override, чем new. Видимо, я сделаю override обязательным для модулей с ключевыми словами на русском и таким образом будет обеспечена инкрементность и своевременность возникновения такой проверки. |
Автор: | budden [ Воскресенье, 22 Ноябрь, 2020 18:00 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Хотя вводить модификатор нужно до перевода... ![]() |
Автор: | budden [ Воскресенье, 22 Ноябрь, 2020 23:58 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Сергей, а вы хотите именно {OVERRIDE}, а не какое-нибудь "#" перед именем модуля? Я смотрю в код парсера и вижу: Код: IF Peek( Scanner.And ) THEN (* constructor *) NextToken; isConstructor := TRUE ELSIF Optional( Scanner.Not ) THEN (* finalizer *) isFinalizer := TRUE ELSIF Optional( Scanner.Minus ) THEN (* inline *) isInline := TRUE; ELSIF Optional( Scanner.LeftBrace) THEN modifiers := Flags(); IF Optional( Scanner.Minus ) THEN (* inline *) isInline := TRUE END; END; Т.е. ряд значков уже используется для изображения модификаторов. Почему бы не добавить ещё один вместо частого выписывания длинного слова? |
Автор: | Sergej Durmanov [ Понедельник, 23 Ноябрь, 2020 20:46 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Я делал с { OVERRIDE } для китайских товарищей, но я хочу, чтобы это было в оригинале, потому что сейчас не понятно, переопределен метод или нет ( а так как все методы в оберонах виртуальные, это может привести к неприятным последствиям ). |
Автор: | Trurl [ Понедельник, 23 Ноябрь, 2020 23:33 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Надо еще флаг на случай, если переопределил не тот метод. |
Автор: | Александр Ильин [ Вторник, 24 Ноябрь, 2020 04:01 ] |
Заголовок сообщения: | , |
Trurl писал(а): Надо еще флаг на случай, если переопределил не тот метод. : ))В смысле, если переопределил не тот метод, но в итоге стало ещё лучше, чем ожидалось? { DO-NOT-FIX }, или в этом духе. |
Автор: | Info21 [ Вторник, 24 Ноябрь, 2020 09:47 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Trurl намекает, что полезно думать головой, а не просто заплатки ставить. И что полезно учиться у предшественников, которые головой думать умеют и об этой конкретной проблеме уже подумали (Блэкбокс). |
Автор: | Sergej Durmanov [ Вторник, 24 Ноябрь, 2020 10:01 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Откровенно говоря, подумали задолго до разработчиков ББ. Решение в ББ, на мой взгляд, плохо тем, что вместо того, чтобы помечать места изменения семантики ( яву это для человека, а не для машины ), разработчики выбрали минимизацию нажатий на кнопки. |
Автор: | Trurl [ Вторник, 24 Ноябрь, 2020 10:28 ] |
Заголовок сообщения: | Re: , |
Александр Ильин писал(а): В смысле, если переопределил не тот метод, но в итоге стало ещё лучше, чем ожидалось? Например, если вместо SetX написал SetY. Тут бы помог флаг {OVERRIDE SetX}. Вообще, много всяких полезных флагов можно придумать. |
Автор: | budden [ Вторник, 24 Ноябрь, 2020 11:53 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Sergej Durmanov писал(а): Я делал с { OVERRIDE } для китайских товарищей, но я хочу, чтобы это было в оригинале, потому что сейчас не понятно, переопределен метод или нет ( а так как все методы в оберонах виртуальные, это может привести к неприятным последствиям ). Ну т.е. есть консенсус именно про ключевое слово, а не значок? Я уже начал делать #Метод, там, правда, какие-то баги в другом месте всплыли. |
Автор: | Sergej Durmanov [ Вторник, 24 Ноябрь, 2020 12:07 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Мне без разницы - я всё равно пользуюсь только оригинальной A2. |
Автор: | budden [ Вторник, 24 Ноябрь, 2020 12:51 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Это понятно. С Феликсом вы договорились о форме? |
Автор: | budden [ Вторник, 24 Ноябрь, 2020 17:40 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Понял, чем плохо # - тем, что нельзя грепом найти все перекрытые методы. Значит, будет {OVERRIDE}/{перекрыта} |
Автор: | budden [ Вторник, 24 Ноябрь, 2020 20:04 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Вроде сделал в ЯОС OVERRIDE/перекрыта и технологию, чтобы плавно это внедрить - оно будет автоматически добавляться при переводе ключевых слов на русский язык. При этом защита от лишнего OVERRIDE/перекрыта работает для любого языка ключевых слов, а недостающий в нужном месте модификатор {перекрыта} вызовет предупреждение только в том случае, если ключевые слова - русские. Уже вставил три недостающих слова в ПошаговыйОтладчик.ярм, который частично перевёл буквально на днях. А давно ли NEW появилось в ББ? Я смотрю, уже в 2001 было слово NEW в компонентном Паскале. Или в 2004? Уж в 2004 точно было. https://web.archive.org/web/20040804100 ... CP-New.pdf Хм, неужели в частных версиях A2 китайские товарищи наслаждались этой возможностью ещё раньше? Что-то у меня не складываются в пазл Ваши слова, Сергей. A2 появилась я так и не понял когда, но дат раньше, чем 2004, я не нашёл. |
Автор: | Info21 [ Вторник, 24 Ноябрь, 2020 22:40 ] |
Заголовок сообщения: | Re: Отсутствие защиты от опечаток в методах при наследовании |
Sergej Durmanov писал(а): Откровенно говоря, подумали задолго до разработчиков ББ. Решение в ББ, на мой взгляд, плохо тем, что вместо того, чтобы помечать места изменения семантики ( яву это для человека, а не для машины ), разработчики выбрали минимизацию нажатий на кнопки. Правильно, разработчики ББ учли уроки предшественников.Отказ от минимизации нажатий может бомбануть в другом месте, заранее не очевидном. У меня два достаточно глубоких каркасика, и проблем с решением ББ не возникает. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |