OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 25 Апрель, 2024 20:01

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 76 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 11 Ноябрь, 2008 17:50 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Comdiv писал(а):
Представим, что это глючное приложение было бы написано на Обероне. Моя задача была бы очень простой: достаточно было бы перенести компактные секции инициализации в процедуры, проследить порядок загрузки модулей, выведя при загрузке имена модулей в лог, и при запуске мидлета выполнить в этом порядке процедуры.


Это оттягивание конца, а не решение проблемы :) Порядок загрузки, даже если он четко регламентирован языком, вещь неочевидная и хрупкая. Решение проблемы - избавление от статитеческих переменных за счет вынесения всей необходимой для работы приложения инициализации в одно обозримое место. См. соседнюю тему "о локализации состояния" viewtopic.php?f=27&t=1226&start=40&st=0&sk=t&sd=a.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Ноябрь, 2008 18:15 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
Vlad писал(а):
Comdiv писал(а):
Представим, что это глючное приложение было бы написано на Обероне. Моя задача была бы очень простой: достаточно было бы перенести компактные секции инициализации в процедуры, проследить порядок загрузки модулей, выведя при загрузке имена модулей в лог, и при запуске мидлета выполнить в этом порядке процедуры.


Это оттягивание конца, а не решение проблемы :) Порядок загрузки, даже если он четко регламентирован языком, вещь неочевидная и хрупкая. Решение проблемы - избавление от статитеческих переменных за счет вынесения всей необходимой для работы приложения инициализации в одно обозримое место. См. соседнюю тему "о локализации состояния" viewtopic.php?f=27&t=1226&start=40&st=0&sk=t&sd=a.

Нет, для моей задачи это было бы решением проблемы. Раз QA пропустил мастер-версию приложения, то при портировании нужно обеспечить его безглючность/глючность за минимальное время. Нет необходимости развивать программу. То, что Вы предлагаете - это один из возможных способов решения и довольно трудоёмкий, поскольку при переносе я мог бы повносить кучу ошибок. Если бы мне нужно было программу сопровождать, то так стоило поступить, а так - это просто лишняя головная боль. Кстати, согласитесь, Ваше предложение было бы проще реализовать в Обероне, а не Java и Си#.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Ноябрь, 2008 22:24 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Запихивание всей инициализации в одно место противоречит структурированию.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Ноябрь, 2008 23:41 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Info21 писал(а):
Запихивание всей инициализации в одно место противоречит структурированию.


У меня есть подозрение, что вы не знаете о чем вообще идет речь. Дабы не скатиться к личным наездам предлагаю обратиться к чему-нибуль более конструктивному, например примерам. Хотя я сходу никакого примера не приведу, потому что проблемы с "неправильной инициализацией" проявляются как раз на больших системах.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 12 Ноябрь, 2008 00:12 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Как можно собрать в одно место инициализацию в компонентной системе?
Общий тут принцип - инициализируем при подключении компонента, а подключается компонент - по нужде, on demand...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 12 Ноябрь, 2008 18:32 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Как можно собрать в одно место инициализацию в компонентной системе?
Общий тут принцип - инициализируем при подключении компонента, а подключается компонент - по нужде, on demand...


Давайте по порядку. Comdiv озвучил следующие проблемы (пусть поправит, если не так):
1) Статические переменные имеют неправильные значения, потому что момент их инициализиции зависит от платформы.
2) Существуют перекрестные ссылки, которые в купе с недетерминированным порядком загрузки классов также приводят к тому, что статические переменные имеют неправильные значения.

Первая проблема - это то же самое, что происходит в случае глобального состояния. А именно: одна компонента (мидлет 1) делает с глобальным состояем что-то, чего совсем не ожидает другая компонента (мидлет 2). Решение проблемы - избавление от глобального состояния и локализация его на уровне выше компонент его потребляющих. Пример:
Код:
class X1
...
static int i = obtain_once_midlet_specific_value(); // значение этой переменной зависит от текущего мидлета, поэтому она имеет неправильное значение, если она не инициализируется на каждой загрузке мидлета


Переписываем так:
Код:
class X1
{
    X1(int midlet_specific_value);
    static int obtain_once_midlet_specific_value(); // эта функция не имеет состояния
...

class Y // компонент уровнем выше компонент X1, X2, Xn
{
    State s; // локализация состояния
....
// "Инициализация в одном месте" (о которой говорю я)
    s = new State(X1.obtain_once_midlet_specific_value(), X2.obtain_once_midlet_specific_value(), Xn.obtain_once_midlet_specific_value());
...
// "Инициализация on demand" (о которой говорите вы (применительно к компонентной системе) и которая никак не противоречит тому, о чем говорю я)
    X1 x1 = new X1(s.x1_state);
    X2 x2 = new X2(s.x2_state);
    Xn xx = new Xn(s.xn_state);


Что касается второй проблемы, то при таком подходе она просто не возникает :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 12 Ноябрь, 2008 19:53 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Vlad писал(а):
Info21 писал(а):
Запихивание всей инициализации в одно место противоречит структурированию.


У меня есть подозрение, что вы не знаете о чем вообще идет речь.

Comdiv пишет вполне ясно.
И вышесформулированный тезис справедлив.
Как говорят японцы, "гоняйте мух со своей головы".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 12 Ноябрь, 2008 20:00 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Info21 писал(а):
Как говорят японцы, "гоняйте мух со своей головы".


Японцы молодцы. А вот вы опять по делу ничего не сказали...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Ноябрь, 2008 20:02 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
Vlad писал(а):
Илья Ермаков писал(а):
Как можно собрать в одно место инициализацию в компонентной системе?
Общий тут принцип - инициализируем при подключении компонента, а подключается компонент - по нужде, on demand...


Давайте по порядку. Comdiv озвучил следующие проблемы (пусть поправит, если не так):
1) Статические переменные имеют неправильные значения, потому что момент их инициализиции зависит от платформы.
2) Существуют перекрестные ссылки, которые в купе с недетерминированным порядком загрузки классов также приводят к тому, что статические переменные имеют неправильные значения.

Первая проблема - это то же самое, что происходит в случае глобального состояния. А именно: одна компонента (мидлет 1) делает с глобальным состояем что-то, чего совсем не ожидает другая компонента (мидлет 2). Решение проблемы - избавление от глобального состояния и локализация его на уровне выше компонент его потребляющих. Пример:
Код:
class X1
...
static int i = obtain_once_midlet_specific_value(); // значение этой переменной зависит от текущего мидлета, поэтому она имеет неправильное значение, если она не инициализируется на каждой загрузке мидлета


Переписываем так:
Код:
class X1
{
    X1(int midlet_specific_value);
    static int obtain_once_midlet_specific_value(); // эта функция не имеет состояния
...

class Y // компонент уровнем выше компонент X1, X2, Xn
{
    State s; // локализация состояния
....
// "Инициализация в одном месте" (о которой говорю я)
    s = new State(X1.obtain_once_midlet_specific_value(), X2.obtain_once_midlet_specific_value(), Xn.obtain_once_midlet_specific_value());
...
// "Инициализация on demand" (о которой говорите вы (применительно к компонентной системе) и которая никак не противоречит тому, о чем говорю я)
    X1 x1 = new X1(s.x1_state);
    X2 x2 = new X2(s.x2_state);
    Xn xx = new Xn(s.xn_state);


Что касается второй проблемы, то при таком подходе она просто не возникает :)


Присмотревшись к Вашему варианту, я понял, что он вообще не является решением моей проблемы. Вы не учли, что статические переменные могут быть приватными, и объявлять их открытыми в чужом классе state просто вредно (да, это нарушение принципа структурирования). Также, судя по "Инициализация on demand", по Вы почему-то предполагаете, что нужны эти переменные только для инициализации, а это не так, при изменении s.x1_state во время работы приложения, оно должно изменится для всех классов, а не только x1. Ваш подход решает только проблему с недетерменированной загрузкой класса. Но если Вы более тщательно обдумаете мой первый пост, то заметите, что и моё предложение решало эту проблему.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Ноябрь, 2008 20:44 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Comdiv писал(а):
Присмотревшись к Вашему варианту, я понял, что он вообще не является решением моей проблемы. Вы не учли, что статические переменные могут быть приватными, и объявлять их открытыми в чужом классе state просто вредно


Я максимально упростил пример. Естественно, что все потроха прячутся за абстрактным интерфейсом.

Comdiv писал(а):
(да, это нарушение принципа структурирования).


Если бы и было нарушение, то инкапсуляции...

Comdiv писал(а):
Также, судя по "Инициализация on demand", по Вы почему-то предполагаете, что нужны эти переменные только для инициализации, а это не так, при изменении s.x1_state во время работы приложения, оно должно изменится для всех классов, а не только x1.


Оно и изменится, как только вы спрячете все за интерфейсом (x1_state станет ссылкой на абстрактный интерфейс, а состояние, спрятанное за этой ссылкой будет единственным для всех объктов класса X1).

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


Нет, оно оттягивало конец :) Попробуйте присмотреться к моемк варианту еще раз с новым пониманием.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Ноябрь, 2008 20:48 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Vlad писал(а):
Info21 писал(а):
Как говорят японцы, "гоняйте мух со своей головы".

Японцы молодцы. А вот вы опять по делу ничего не сказали...

А вы бы свои подозрения держали внутри своего мозга.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Ноябрь, 2008 23:20 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Info21 писал(а):
А вы бы свои подозрения держали внутри своего мозга.


Судя по тому, что вы так ничего и не сказали по теме, мои подозрения оправдались. Не знаете что сказать - послушайте других, вместо того, чтобы пытаться выдавить что-нибудь гаденькое и не по делу в адрес лично вам неприятных оппонентов...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Ноябрь, 2008 00:53 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Vlad писал(а):
... послушайте других, вместо того, чтобы пытаться выдавить что-нибудь гаденькое и не по делу в адрес лично вам неприятных оппонентов...

Это кто сказал "гаденькое":
Vlad писал(а):
У меня есть подозрение, что вы не знаете о чем вообще идет речь. Дабы не скатиться к личным наездам
И кто тут на личности переходит?
Vlad писал(а):
Хотя я сходу никакого примера не приведу ...
Так кто сказать не может?

Ну и ну. От вас услышишь. Скрип тормозов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Ноябрь, 2008 10:47 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Info21 писал(а):
И кто тут на личности переходит?
Непринципиальный вопрос.
Info21 писал(а):
Vlad писал(а):
Хотя я сходу никакого примера не приведу ...
...
Ну и ну. ...Скрип тормозов.
Напрасно. Как я понял Vlad ожидал пояснения почему его подход противоречит структурированности.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Ноябрь, 2008 14:01 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Давайте жить дружно! :)
У нас разные задачи, разный опыт, поэтому какие-то расхождения в оценках неизбежны. С этим придётся жить, ничего не поделаешь. :roll:

По сути.
Я вообще не очень понимаю, что именно обсуждается в данной ветке и ещё 1-2 ветках (например, о локализации состояния).
Давайте примем во внимание, что:
1. В ОС Оберон и ББ отказ от статических переменных невозможен, т.к. хранение структур данных в оперативной памяти между выполнением команд - основа эффективности этого подхода. (Ср. с подходом UNIX, где "всё есть файл".)
2. Оберон создан (в том числе) для компонентного программирования, так что полную (а не частичную) упорядоченность язык гарантировать не может. Основные проблемы решены избавлением от циклического импорта, и на практике это большой шаг вперёд. (Ср. с примером циклического импорта из C#, приведённым Сергеем Губановым.)
3. Нарушение инкапсуляции одновременно является нарушением принципа структурирования.

Остаётся ситуация с частичной упорядоченностью набора модулей и возможной в связи с этим разновидностью ситуации гонок (race condition) при инициализации.
Здесь вопрос к опытным программистам чёрного ящика: возникали у них на практике с этим проблемы или нет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Ноябрь, 2008 15:06 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
GUEST писал(а):
... почему его подход противоречит структурированности.

Объяснять, почему собирать все инициализации в одно место противоречит структурированности ("разделяй и властвуй")? Можно, я не буду...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Ноябрь, 2008 15:26 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
AVC писал(а):
Остаётся ситуация с частичной упорядоченностью набора модулей и возможной в связи с этим разновидностью ситуации гонок (race condition) при инициализации.
Не буду приводить искусственных примеров.
Возьмём реальный модуль HostFiles. При инициализации этого модуля устанавливается глобальная переменная из модуля Files:
Код:
Files.SetDir(dir);
Реальна ли на практике ситуация, когда модулей, желающих при своей инициализации установить эту переменную, окажется больше одного? Есть ли в этом какая-нибудь опасность?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Ноябрь, 2008 16:16 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Info21 писал(а):
GUEST писал(а):
... почему его подход противоречит структурированности.

Объяснять, почему собирать все инициализации в одно место противоречит структурированности ("разделяй и властвуй")?
Кажется я ясно сказал, что. Или нужно повторить?
Info21 писал(а):
Можно, я не буду...
Можно, но нежелательно...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Ноябрь, 2008 17:39 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
GUEST писал(а):
Info21 писал(а):
GUEST писал(а):
... почему его подход противоречит структурированности.

Объяснять, почему собирать все инициализации в одно место противоречит структурированности ("разделяй и властвуй")?
Кажется я ясно сказал, что. Или нужно повторить?

Уважаемый GUEST, честно говоря, не в первый раз просто не понимаю Ваших постов, видимо, из-за их иногда чрезмерной краткости.
(Похожий эффект иногда с постами Trurl'я бывает.)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Ноябрь, 2008 18:15 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Info21 писал(а):
...честно говоря, не в первый раз просто не понимаю Ваших...

Что бы прекратить "базар", нужно, что бы кто-то замолчал...
А публика ЗДЕСЬ сама решит на чьей стороне истинна в конкретном вопросе...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 76 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB