Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - vlad

Страницы: 1 ... 88 89 [90] 91 92 93
1336
Общий раздел / Re:Функции против процедур
« : Февраль 28, 2011, 04:48:29 pm »
Значит ваш фреймворк не является классным

Ну вот я об этом и говорил. В таком виде - бесполезная штука. Не могу я помечать в интерфейсе функцию pure без риска получить плохую расширяемость. Соответственно, не могу использовать абстрактные аргументы в pure-функциях. Соответственно, использование pure функций ограничивается локальными штуками типа вычисления факториала - неюзабельно :)

1337
Общий раздел / Re:Функции против процедур
« : Февраль 28, 2011, 04:35:18 pm »

Еще раз хочу заметить: по моему убеждению мы не можем пометить X::do как pure, потому что мы не знаем заранее - сможет ли ее наследник реализовать как pure.

А что нам мешает ТРЕБОВАТЬ  от наследника PURE реализации?

Ну вот смотрите, я определил интерфейс X с "pure do()" и написал классную pure функцию:
void f(X &x) pure
{
    x.do(); // pure
}

Теперь я вас прошу реализовать мне x::do. Как вы будете ее реализовывать, если вам для этого нужно прочитать файл? Вы придете ко мне и скажете, чтобы я убрал pure из f и из X::do? А если я работаю в другой конторе, а вы лишь используете мой классный расширяемый фрэймворк?

1338
Общий раздел / Re:Функции против процедур
« : Февраль 28, 2011, 04:07:05 pm »
Vlad- Вы про это говорили? В этой статье речь идет о формальном контороле на этапе компиляции отсутствия в тексте реализации глобальных сущностей (не передаваемых через интерфейс), Если используются внешние функции внутри реализации то  возможность компиляции кода определяется  сигнатурой вызова этой функции (если она помечена как чистая компиляция идет успешно). Вас такое решение устроит?  :)

Устроит, как только я пойму как будет работать такое:
struct X
{
    virtual void do() = 0;
};

void f(X &x) // pure или не pure?
{
    x.do();
}

Еще раз хочу заметить: по моему убеждению мы не можем пометить X::do как pure, потому что мы не знаем заранее - сможет ли ее наследник реализовать как pure.
Почти тоже самое в другой формулировке (без ООП):
void f(F prediacte); // f может быть pure только если F - тоже pure
Что делать, если нам нужно вызвать f, а на руках у нас не-pure predicate?
1. Не чистая - просто потому что она (Do) обьявлена без модификатора

Если я f() объявлю как pure, то что будет:
1. Не скомпилится (вызов x.do() - не-pure)
2. Ошибка в рантайме, если конкретная реализация x.do является не-pure
Если 1 - то это то, о чем я говорил в самом начале (мало для чего можно использовать такие pure функции).
Если 2 - то мне такое принципиально не нравится

Цитировать
2.Просто f не обьявлять как чистую

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

1339
Общий раздел / Re:Функции против процедур
« : Февраль 28, 2011, 03:47:59 pm »
не перестает, если у нас сохранился интерфейс к этим функциям.
То есть вы предлагаете реализовать это в виде скрытого параметра?


Я так понимаю - просто в имени DLL-функции будет зашифровано pure она или нет. Как сейчас шифруются типы параметров для С++ функций.

1340
Общий раздел / Re:Функции против процедур
« : Февраль 28, 2011, 03:45:46 pm »
Vlad- Вы про это говорили? В этой статье речь идет о формальном контороле на этапе компиляции отсутствия в тексте реализации глобальных сущностей (не передаваемых через интерфейс), Если используются внешние функции внутри реализации то  возможность компиляции кода определяется  сигнатурой вызова этой функции (если она помечена как чистая компиляция идет успешно). Вас такое решение устроит?  :)

Устроит, как только я пойму как будет работать такое:
struct X
{
    virtual void do() = 0;
};

void f(X &x) // pure или не pure?
{
    x.do();
}

Еще раз хочу заметить: по моему убеждению мы не можем пометить X::do как pure, потому что мы не знаем заранее - сможет ли ее наследник реализовать как pure.
Почти тоже самое в другой формулировке (без ООП):
void f(F prediacte); // f может быть pure только если F - тоже pure
Что делать, если нам нужно вызвать f, а на руках у нас не-pure predicate?

1341
Общий раздел / Re:Функции против процедур
« : Февраль 28, 2011, 01:22:23 pm »
И чего полезного такие функции могут посчитать?
Вторичные данные. То есть те данные, которыми мы не располагали до вызова функции.
Вопросики какие-то детские пошли  :D

Вопросик немного шире :) Данные в немаленьких системах не лежат настолько открыто, чтобы функции могли "прочитать" все что нужно. Данные инкапсулированы и скрыты за абстракциями. Т.е., разделение на процедуры/функции должно распространятся и на методы (связанные процедуры/функции). Такое уже есть в C++ (const методы), поэтому я хорошо представляю, что это такое. Вы не можете заранее (в абстрактном интерфейсе) определить будет ли метод функцией (const), потому что вы ничего не можете предполагать о реализации этого метода. В С++ эта проблема нивелируется наличием явного приведения к не-const и наличием mutable-данных. Поэтому в С++ наличие const у методов носит сугубо логический характер. Помечая метод const вы позволяете его вызов для const объекта. Не более того. Т.е., вызывая const метод вы не имеете никакой гарантий, что не будет сайд эффектов.
Следствие же вашего предложение будет таким, что функции вообще ничего полезного выдать не смогут и расширяться тоже не будут. Ну факториал посчитают, да. Массив переколбасят по какому-то жесткому алгоритму (без использования абстракций). А вот в лог уже не запишут. Зачем такая штука (в таком ограниченном виде) в языке - не представляю.

1342
Общий раздел / Re:Функции против процедур
« : Февраль 27, 2011, 03:42:04 pm »
Поясните пожалуйста. Что значит для чтения? Вызывать другие функции очевидно можно? А процедуры?
"Разрешены только для чтения" - это значит они могут быть использованы в качестве операнда в выражении, но им самим ничего нельзя присваивать.
Внутри описания функции могут быть вызовы других функций. Вызовы процедур в теле функции запрещены (правило 3), так как эти процедуры могут изменить глобальное состояние программы.

Ага. Т.е., у нас остаются только глобальные переменные на чтение и другие функции. Правильно? И чего полезного такие функции могут посчитать?

P.S. Пока это очень похоже на плюсовый const, за исключением доступа к внешним сущностям.

1343
Скажем Блэкбокс, по моему убеждению, совершенно напрасно замешан на COM. Для этого не было никаких веских оснований, зато должно было усложнить портирование на Линукс. По поводу оснований даже страшно предположить (неужели "прогиб" под Microsoft?  :( Не, не верится...)
НЕ COM!!!!
В ББ сделано ИМХО ГОРАЗДО лучше. Профи С++ признавались, что на освоение "мутных" концепций COM уходило до полугода. Модули-компоненты в ББ не требуют стольких усилий... Вообще усилий по изучению не требуют - все естественно и понятно.

ИМХО, основная проблема в понимании COM в том, что он проецируется на конкретный язык (С++) и на нем же объясняется как это работает. Понятно, что нифига непонятно будет :) Сейчас вспоминаю - агрегация в COM, например, уже чего там только не написано было про нее, магия какая-то. А ведь это просто агрегация :)

P.S. COM в винде не умрет, даже не надейтесь :) Альтернативы в каких-то задачах (виндовый shell, например) ему по-прежнему нет.

1344
Общий раздел / Re:Функции против процедур
« : Февраль 27, 2011, 02:58:25 pm »
Конкретно хочется услышать ответ на вопрос: если мы запрещаем из функции обращение ко всем "внешним" сущностям и ограничиваем аргументы простыми типами (даже не процедурными) - то что полезного можно получить из таких функций.
Не "запрещаем", а "разрешаем только для чтения". Эти "внешние" сущности вполне могут выступать в качестве первичных данных, наряду с параметрами функции.

Поясните пожалуйста. Что значит для чтения? Вызывать другие функции очевидно можно? А процедуры?

1345
Общий раздел / Функции против процедур
« : Февраль 27, 2011, 03:19:08 am »
Обсуждение как-то затерялось в общем потоке, поэтому решил выделить в отдельную тему.
Итак, из того, что было сказано, я понял, что смысл разделения процедура функция сводится к (поправьте):
1. Функция не имеет побочных эффектов.
2. Процедура не возвращает значения (или косвенно возвращает через OUT-аргументы).

По поводу пункта 1 у меня никаких возражений нет - да, хочется контролировать побочные эффекты. И такое разделение иметь полезно, пока мы имеем некий компромиссный ЯП (не хаскель ;)
По поводу пункта 2 - вообще непонятно зачем такое ограничение. Пусть возвращает нормальный результат. Зачем кому-то нужны OUT-параметры?

Далее по реализации. Если брать за базу оберон, то какие изменения нужны в языке, чтобы обеспечить пункт 1? Если ничего нельзя сделать - тогда извините, но такое разделение совсем не нужно и плодит лишние сущности.
Конкретно хочется услышать ответ на вопрос: если мы запрещаем из функции обращение ко всем "внешним" сущностям и ограничиваем аргументы простыми типами (даже не процедурными) - то что полезного можно получить из таких функций.

1346
Общий раздел / Re:Оберон в образовании.
« : Февраль 27, 2011, 02:57:05 am »
2) Не акцентирует внимание на синтаксисе. Вообще самое страшное что может случиться с (будующим)программистом -- пристрастие к какому-либо типу синтаксиса. Язык по синтаксису оценивать вообще нельзя. Синтаксис вторичен. Полно народу видел, которые вроде бы и не глупые люди, но воспринимают ровно один какой-то синтаксис, а все языки не с таким синтаксисом считают неполноценными/ущербными.

Угу, Вирт - как раз из таких людей ;)

1347
Общий раздел / Re:Грани цензуры.
« : Февраль 27, 2011, 02:52:37 am »
Тут можно таки да, спокойно, обсудить что нам гоже а что не гоже писать на форуме. Например блины и хрены могут ли использоваться как эрзац-заменители более недвусмысленных гм.. терминов. Ну и т.п.

PS. Я таки да, верю в демократию :-) По кр. мере в возможность разумного диалога.

Матюги не хотелось бы видеть. А так - каждый сам выбирает как высказываться.

1348
Общий раздел / Re:Оберон в образовании.
« : Февраль 26, 2011, 04:52:07 am »
Цитировать
Конечно, если функция ничего не возвращает, то "ничего" не может быть приведено к "соответствующему типу". Т.е., это общая ошибка несоответствия типа. Зачем различать, тем более синтаксически? Я не ратую за сишные функции. Просто хочу разобраться :) Может я чего не понимаю и можно почерпнуть какую-то полезность из такого (как мне сейчас кажется) искусственного разделения. Пока я вижу только вред.
Ну, в командах процессора это действительно одинаково. Но ведь фортранисты для чего-то разделил? Может быть, для читабельности?

Это было давно и неправда :) Если для читабельности - то в каких случаях?

1349
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 09:52:13 pm »
А чем плох тотальный конст? (опять же, можно сделать тотальный конст, но указать исключения из тотальности для данного конкретного случая. хотя... и исключения не нужны -- достаточно дать отдельными параметрами не константными ссылками на те места структуры, которые можно таки менять).

Не знаю. Просто у меня нет четкой картинки как это будет работать и какие из этого буду следствия. Многие языки вообще обходятся без const. И я в последнее время редко возлагаю на const решающую роль в деле контроля над модифицируемостью. Более наглядно получается разделение на уровне интерфейса - вот здесь есть метод write, а у этого только read.

1350
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 09:46:59 pm »
Посмотрите на тот же буст например.

Не надо смотреть на буст, если вы не программируете на C++ :) Лучше спросить у тех, кто его использует, какие проблемы он помогает решать.

P.S. И уж тем более не надо смотреть его исходники ;)

Страницы: 1 ... 88 89 [90] 91 92 93