OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 13 Декабрь, 2017 14:03

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




Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Понедельник, 13 Июль, 2009 20:41 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Модератор: выделена тема. Инициирующее сообщение - viewtopic.php?p=31833#p31833

Info21 писал(а):
Да, настоящие модули -- вещь.
Начинаешь это остро ощущать, когда приходится типа переносить на какой-нибудь С++ программу с Оберона.
Какие трудности? Оно один в один транслируется. Вот наоборот - это да... Или у вас каждая программа на обероне жить не может без динамической загрузки модулей и рефлекшина?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Понедельник, 13 Июль, 2009 21:24 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Цитата:
Какие трудности?
Частично экспортируемые записи в C++ будут выглядеть как полностью открытые структуры или у Вас есть другое решение?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 00:02 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
slava писал(а):
Цитата:
Какие трудности?
Частично экспортируемые записи в C++ будут выглядеть как полностью открытые структуры или у Вас есть другое решение?


Они буду выглядеть как private...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 00:07 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
И как их юзать "вне модуля"?
Если предложите аксессоры, так это тот же public.
Короче, как всегда, вам бы поспорить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 00:26 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
slava писал(а):
И как их юзать "вне модуля"?


В смысле как? Если они неэкспортируемые, то зачем их юзать вне модуля? Все экспортируемые сущности прописываете в .h-файле, некспортируемые поля прописываете private, все методы кладете в одноименный .cpp. Вот вам прямое отображение обероновского модуля в плюсовый "модуль". Где "острые" ощущения?

slava писал(а):
Если предложите аксессоры, так это тот же public.
Короче, как всегда, вам бы поспорить.


Это вам - лишь бы пнуть C++ :) Надо быть хоть чуть-чуть объективнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 01:06 

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

Острое ощущение -- это непривычное ощущение полной уязвимости со всех возможных сторон с одновременным ощущением категорического желания организма как можно быстрее отойти от этой феноменальной херни как можно дальше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 01:16 

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


А. Значит шашечки. Так бы сразу и сказали :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 10:25 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Это значит, что у народа закончилось терпение с Вами дискуссировать.
Один я еще на что то надеюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 10:35 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Vlad писал(а):
...Если они неэкспортируемые, то зачем их юзать вне модуля? Все экспортируемые сущности прописываете в .h-файле, некспортируемые поля прописываете private, все методы кладете в одноименный .cpp. Вот вам прямое отображение обероновского модуля в плюсовый "модуль"...
Поля должны быть скрытыми для всех сущностей вне модуля, но открытыми для всех сущностей внутри модуля.
В С++ Вам этого не отобразить.

Ада -- "да". Ява с ее пакетами, хоть как то "да". С++ -- "нет", Питон (насколько я знаю) -- тоже "нет".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 11:10 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 12:01 

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


Еще раз - вам шашечки или ехать? :) Я говорю - что все конструкции оберона замечательно перекладываются в C++ "один в один" без потери смысла и без напряжения мозга. С точностью до синтаксиса. Конкретные возражения будут?
.h
Код:
class Record1
{
    friend void f1(Record1& r);
public:
    int x;
private:
    int y;
};


.cpp
Код:
void f1(Record1& r)
{
    r.y = 1;
}


Тут что-то не понятно? Но ладно, допустим вам позарез надо иметь доступ к Record1::y из функции f2, причем функция f2 должна быть внутренней функцией модуля (никто извне не может ее вызвать). Тогда можно более общий случай расписать:

.h
Код:
class Record1;

class Module1
{
public:
    static void f1(Record1& r);
private:
    static void f2(Record1& r);
};

class Record1
{
    friend class Module1;
public:
    int x;
private:
    int y;
};


.cpp
Код:

void Module1::f1(Record1& r)
{
    r.y = 1;
    f2(r);   
}

void Module1::f2(Record1& r)
{
    r.y = 3;
}


Хотя я бы такой прием использовал только если надо начисто отключить мозг при переводе оберон -> С++. Иначе можно использовать обычную декомпозицию на функции-члены (писанины меньше), но при этом да, "один в один" не получится.

slava писал(а):
Питон (насколько я знаю) -- тоже "нет".


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 12:16 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2178
Откуда: Нижний Новгород
slava писал(а):
Поля должны быть скрытыми для всех сущностей вне модуля, но открытыми для всех сущностей внутри модуля.


На самом деле можно и без классов.

Вот вам cpp'шник. Попробуйте ка откуда-нибудь ещё получить доступ к переменной var:

Код:
namespace {
    int var = 10;
}


По моему, народ просто довольно плохо знает С++ :roll:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: есть ли ООП в Обероне-07
СообщениеДобавлено: Вторник, 14 Июль, 2009 12:44 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Vlad писал(а):
...

Так и скажите, что будете френдить всех со всеми.
Имеем N сущностей в одном модуле, прописываем в каждом классе всех N френдов.
Думаю о красоте такого кода спорить не будем.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 12:45 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Alexey Veselovsky писал(а):
Вот вам cpp'шник. Попробуйте ка откуда-нибудь ещё получить доступ к переменной var:
Вы о чем?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 13:27 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2178
Откуда: Нижний Новгород
slava писал(а):
Alexey Veselovsky писал(а):
Вот вам cpp'шник. Попробуйте ка откуда-нибудь ещё получить доступ к переменной var:
Вы о чем?


Ну, давайте лучше на примере. Дайте модель на обероне который перевести на c++. Посмотрим что выйдет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 14:50 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 2846
Откуда: Астрахань
Я абсолютно согласен с Владом: с Оберона на С++ перевести достаточно легко. Обратно - значительно сложнее из-за управления памятью.
А механизмов инкапсуляции в С++ больше и с их помощью моделируется какой угодно доступ. И пространства имен, и классы с тремя видами доступа, и файлы (можно в файле сделать локальной как функцию, так и любую переменную. И френдить всех со всеми не требуется. Герб Саттер приводит в своей книжке простой прием, в котором дружественность выборочная - одной функции открыто, другой - закрыто.
А доступ только по чтению, который так часто приводят оберонщики в качестве плюса Оберонам - это просто свойства. Которые в каждой интегрированной С++ среде реализованы. И еще на РСДН могу статью показать "Свойства в С++". А в Додиез своства уже как конструкции языка входят.
С++ значительно более гибок в смысле инкапсуляции. Но эта гибкость - для экспертов, а не для простых прикладных программеров. Как говориться, палка - о двух концах.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 16:34 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2178
Откуда: Нижний Новгород
Валерий Лаптев писал(а):
А доступ только по чтению, который так часто приводят оберонщики в качестве плюса Оберонам - это просто свойства. Которые в каждой интегрированной С++ среде реализованы. И еще на РСДН могу статью показать "Свойства в С++". А в Додиез своства уже как конструкции языка входят.

Ну, во-первых при чем тут IDE? Эти самые проперти (ака свойства) не фича IDE, а нестандартное расширение языка некоторыми компиляторами. Пользоваться ими -- моветон. Тем более что они легко реализуются через шаблоны, т.е. расширение языка ни чем не обосновано (разве что т.н. "историческими причинами").

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

Код:
#include <iostream>

struct A
{
    const int& a;
    A () : mA(10), a(mA) {}
private:
    int mA;
};

int main()
{
    A a;
    int b = a.a; // ok
    std::cout << a.a << std::endl; // ok
    a.a = 10; // error. поле только для чтения!
    return 0;
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 17:23 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2178
Откуда: Нижний Новгород
Теперь хм.. Полное решение. Итак, хотим чтобы:
1) Структура/класс/запись имела поля только для чтения, имела поля доступные только внутри модуля и имела поля доступные всем.
2) Хотим иметь доступ ко всем полям структуры внутри модуля.

Хедер (спецификация модуля):
Код:
struct A
{
    int rwField; // полный доступ
    const int& roField; // поле только для чтения
    virtual ~A(){}
protected:
    A(int& ro) : roField(ro), rwField(0) {}
};

A* createA();
void setRo(A& self,int val); // просто для примера. меняет значение поля A::roField.


cpp'шник (ака тело модуля)
Код:
#include "A.h"

namespace {

struct B : A {
    int ro;
    int privateField; // поле доступное только внутри модуля
    B() : A(ro), ro(666) {}
};

}

A* createA() {
    return new B;
}

void setRo(A& self, int val) {
    B* s = dynamic_cast<B*>(&self);
    if (s) s->ro = val;
}


Пример использования:
Код:
#include <iostream>
#include "A.h"

int main()
{
    A* p_a = createA();
    std::cout << p_a->rwField << "\t" << p_a->roField << std::endl;

    p_a->rwField = 16;
    setRo(*p_a,255);

    std::cout << p_a->rwField << "\t" << p_a->roField << std::endl;

    delete p_a;

    return 0;
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 17:37 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Это "аналог" чего, вот этого? :shock:
Код:
MODULE A;
   VAR
      rwField*: INTEGER;
      roField-: INTEGER;
      privateField: INTEGER;   

   PROCEDURE setRo*(val: INTEGER);
END A.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 17:41 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2178
Откуда: Нижний Новгород
slava писал(а):
Это "аналог" чего, вот этого? :shock:
Код:
MODULE A;
   VAR
      rwField*: INTEGER;
      roField-: INTEGER;
      privateField: INTEGER;   

   PROCEDURE setRo*(val: INTEGER);
END A.


Нет. Читайте внимательней.


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

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


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

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


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

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