Переменные и методы класса выдают ошибку компиляции

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение and » 06.09.2016 20:04:33

Лекс Айрин писал(а):SSerge "Если оно выглядит как утка, плавает как утка и крякает как утка, то это утка".
Это утки совсем разного полёта :-)
ClassName - имя класса. Что в Delphi, что в Lazarus. Классовый метод.
ToString - виртуальный метод для получения "строкового представления" объекта. По умолчанию, там имя класса - но можно определить любое поведение. Не помню, был ли аналогичный метод в Delphi.

Добавлено спустя 4 минуты 53 секунды:
atom писал(а):Циклические ссылки как раз и получаются, если оба юнита имеют в интерфейсной части описания друг на друга. В моем коде как раз стоит в implementation.
Всегда считал возможность "типа как бы развязать" циклические ссылки путём запихивания одной из зависимостей в Implementation крайне вредной возможностью. Лучше б язык твёрдо запрещал закольцованность, а не ограничивался полумерами.
Массу разнообразных глюков при компиляции имел возможность наблюдать при таком "развязывании".

Грязь надо убирать, а не заметать под коврик.

Добавлено спустя 7 минут 15 секунд:
zub писал(а):
Вообще мистика.

Сделай минимальный пример с ошибкой и мистика рассеется
+1.
Не вижу в огрызках ничего неправильного. Что-то Вы не показали.
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение Лекс Айрин » 06.09.2016 20:38:44

and писал(а):Всегда считал возможность "типа как бы развязать" циклические ссылки путём запихивания одной из зависимостей в Implementation крайне вредной возможностью. Лучше б язык твёрдо запрещал закольцованность, а не ограничивался полумерами.


тогда язык будет менее гибким. Вообще-то, это вполне официальная рекомендация.

and писал(а):Грязь надо убирать, а не заметать под коврик.


Это не грязь. Это особенность языка связанная с тем, что все типы/переменные должны быть предварительно описаны.
Вот честно, иногда приходится дазе при всей нелюбви к этому делу поступать именно так, потому что по другому работать не будет.

and писал(а):Массу разнообразных глюков при компиляции имел возможность наблюдать при таком "развязывании".


ни разу не видел, но верю. Любую ситуацию можно довести до абсурда.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3714
Зарегистрирован: 19.02.2013 16:54:51

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение zub » 06.09.2016 20:56:26

>>тогда язык будет менее гибким. Вообще-то, это вполне официальная рекомендация.
Запретить конечно черезчур, но избегать надо до последнего. Никакая это не официальная рекомендация
Хочешь иметь полностью модульную программу - имей uses только в разделе interface.
Как только появляется необходимость в implementation uses, а тем более в зацикливании - первый знак что либо разбивка по модулям неправильная - по сути эти 2 модуля друг без друга уже использоваться не могут и это равносильно слиянию их в один

>>Это не грязь. Это особенность языка связанная с тем, что все типы/переменные должны быть предварительно описаны.
Это плохо. Ты говоришь я использую это и это. а потом выясняется что на самом деле еще то и то))

>>ни разу не видел, но верю. Любую ситуацию можно довести до абсурда.
Самое простое - при многочисленых зацикливаниях становится невозможно предсказать последовательность выполнения секций initialization\finalization модулей. Вроде всё работает, добавил что то куда то в усес и перестало - что то проинициализировалось раньше того что оно использует.
Кроме того в fpc на такой программе гораздо легче схватить какойнить internal error (багов в нем пока хватает) вплоть до вообще невозможности скомпилировать
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение Лекс Айрин » 06.09.2016 21:02:31

zub писал(а): но избегать надо до последнего.


Я ж не спорю.
zub писал(а):Ты говоришь я использую это и это. а потом выясняется что на самом деле еще то и то))

Это лучше, чем по десять раз описывать одно и тоже. И да, меня это тоже нервирует.

zub писал(а):Вроде всё работает, добавил что то куда то в усес и перестало - что то проинициализировалось раньше того что оно использует.

Такое я в своей проге ловил и без зацикливаний((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3714
Зарегистрирован: 19.02.2013 16:54:51

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение zub » 06.09.2016 21:08:13

>>Это лучше, чем по десять раз описывать одно и тоже
А вот описывать одно и тоже в разных местах точно надо запретить. оно совсем не одно и тоже потом становится))
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение and » 06.09.2016 21:17:13

Лекс Айрин писал(а):тогда язык будет менее гибким.
Он будет более строгим. Что всегда считалось плюсом Паскаля.
Лекс Айрин писал(а):Это не грязь. Это особенность языка связанная с тем, что все типы/переменные должны быть предварительно описаны.
Не вижу, как первое утверждение вытекает из второго.
Да, всё используемое должно быть предварительно описано. Это и есть одно из проявлений строгости языка.
Если Вас коробит слово "грязь" - замените его на "прокол при проектировании архитектуры приложения".
Лекс Айрин писал(а):по другому работать не будет
Ой, да ладно! Всё можно развязать цивилизованно. Например, ввести третий модуль.

Добавлено спустя 4 минуты 33 секунды:
zub писал(а):Кроме того в fpc на такой программе гораздо легче схватить какойнить internal error (багов в нем пока хватает) вплоть до вообще невозможности скомпилировать
Угу, именно оно.
Пример: в пакете был цикл. Приложение не компилировалось, пока в один из модулей цикла не внесёшь "холостую правку", чтобы заставить пакет пересобраться при компиляции приложения.
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение zub » 06.09.2016 21:34:23

Кстати циклы не всегда бывают из 2х модулей. Бывают и из гораздо большего количества - тогда головой понять что от чего зависит вообще неполучится - приходится юзать например cody чтоб чтото понять и разрулить
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение and » 06.09.2016 21:46:53

and писал(а):Кстати циклы не всегда бывают из 2х модулей
В примере выше (цикл в пакете) было четыре.

Такие зависимости - imho такой же порок в архитектуре приложения, как и взаимно ссылающиеся таблицы в архитектуре БД. Впрочем, встречается мнение (на sql.ru как-то видел довольно горячую дискуссию), что это нормальное положение дел, так и надо проектировать >:-E
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение Лекс Айрин » 07.09.2016 09:50:48

and писал(а):Он будет более строгим.


не будет.

and писал(а):Не вижу, как первое утверждение вытекает из второго.
Да, всё используемое должно быть предварительно описано. Это и есть одно из проявлений строгости языка.


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

and писал(а):Ой, да ладно! Всё можно развязать цивилизованно. Например, ввести третий модуль.


И все дополнительно усложнить. Вообще, я соглашусь с тем, что это прокол при проектировании.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3714
Зарегистрирован: 19.02.2013 16:54:51

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение and » 08.09.2016 17:27:32

Лекс Айрин писал(а):Нельзя описать некоторые вещи не используя предварительное описание. (например, ссылку на объект типа который сейчас описываешь в самом типе)
Не совсем понял, о чём речь. О вложенных (nested) типах? Не вижу разницы с общим правилом (указатель на тип можно объявить раньше типа):
Код: Выделить всё
  TFoo=Class
       Public
         Type
           PBar=^TBar;
           TBar=Class
                End;
       End;
Снаружи - да, нельзя объявить указатель на nested-тип (PBar=^TFoo.TBar). (Правильность такого запрета imho спорна, но...)
Лекс Айрин писал(а):использовать менее жесткий, но более гибкий подход с предварительным описанием
В языке вагон и маленькая тележка возможностей на эту тему: правило с указателями выше, форвардное описание процедур/функций, классов... Плюс "похожие на форвадинг" фичи: полиморфизм, интерфейсы... "Чего ж тебе ещё, хороняка, надо?!" (C)
Лекс Айрин писал(а):Ибо обычно один модуль один класс.
ЧЕГО-О-О?! 8-O
Обычно (хотя и не обязательно) один модуль - одна форма, но класс... Ммм...
Лекс Айрин писал(а):Вообще, я соглашусь с тем, что это прокол при проектировании.
Вот и ладушки :-)

Добавлено спустя 1 минуту 56 секунд:
Лекс Айрин писал(а):
and писал(а):Он будет более строгим.
не будет.
Если дерево (а не миска спагетти) зависимостей - это не строгость, то я не знаю, что и предложить.
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение Лекс Айрин » 08.09.2016 18:30:46

and писал(а):(указатель на тип можно объявить раньше типа):


При очень строгой типизации нельзя.

and писал(а):В языке вагон и маленькая тележка возможностей на эту тему: правило с указателями выше, форвардное описание процедур/функций, классов... ... "Чего ж тебе ещё, хороняка, надо?!" (C)


Это как раз отход от строгого подхода.

and писал(а):Обычно (хотя и не обязательно) один модуль - одна форма, но класс... Ммм...


А форма у нас не класс? :shock: То есть, это отдельная конструкция языка?

and писал(а):Если дерево (а не миска спагетти) зависимостей - это не строгость, то я не знаю, что и предложить.


дерево в идеале. Иногда это все-таки граф.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3714
Зарегистрирован: 19.02.2013 16:54:51

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение and » 08.09.2016 19:46:18

Лекс Айрин писал(а):При очень строгой типизации нельзя.
and писал(а):В языке вагон и маленькая тележка возможностей на эту тему: правило с указателями выше, форвардное описание процедур/функций, классов...
Это как раз отход от строгого подхода.
Давайте без фанатизма. Отказ от опережающих деклараций сделает невозможным явное описание многих классических структур данных: связных списков, деревьев и т.д.
Лекс Айрин писал(а):А форма у нас не класс? :shock: То есть, это отдельная конструкция языка?
Все пингвины - птицы. Все ли птицы - пингвины?
Лекс Айрин писал(а):дерево в идеале. Иногда это все-таки граф.
Что-то опять пингвины в голову лезут :-D
Это всегда граф. Вопрос в том, какой это граф: ациклический (дерево) или с циклами. Второе - зло (imho), степень вреда от него варьируется от "безвредно и даже слегка полезно" до "ведёт к гейзенбагам (проявляющимся, по известному закону, в самый неподходящий момент)".

Добавлено спустя 1 минуту 42 секунды:
Любопытно, ТС решил свою проблему? А то вдруг мы тут в теоретические диспуты полезли, а у него дело стоИт...
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение Лекс Айрин » 08.09.2016 20:32:31

and писал(а):Отказ от опережающих деклараций сделает невозможным явное описание многих классических структур данных: связных списков, деревьев и т.д.


так я про это и говорю.

and писал(а): Второе - зло (imho), степень вреда от него варьируется от "безвредно и даже слегка полезно" до "ведёт к гейзенбагам (проявляющимся, по известному закону, в самый неподходящий момент)".


Самое смешное, что зачастую достаточно небольшое изменение в одном из модулей может убрать циклическую зависимость.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3714
Зарегистрирован: 19.02.2013 16:54:51

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение and » 08.09.2016 21:11:55

Лекс Айрин писал(а):Самое смешное, что зачастую достаточно небольшое изменение в одном из модулей может убрать циклическую зависимость.
and писал(а):Ой, да ладно! Всё можно развязать цивилизованно. Например, ввести третий модуль.
Консенсус :-)
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Переменные и методы класса выдают ошибку компиляции

Сообщение Лекс Айрин » 08.09.2016 21:26:30

and, не совсем. Есть и более цивильные способы. Например, не лезть из объекта в потроха родителей или других объектов. Ну и продумать архитектуру приложения.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3714
Зарегистрирован: 19.02.2013 16:54:51

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru