metaclass: (Default)
[personal profile] metaclass
Как минимум, такого:
Пишем функцию с двумя(или одним) параметрами. Первый параметр - объект, второй - его метод. Если параметр один - то это кортеж содеращий в себе объект и метод.
Вызываем с произвольным объектом и его методом. Функция выполняет метод, и возвращает его результат в виде строки, а если валится исключение, то возвращает строку, описывающую исключение.
И все это для того, чтобы было проще писать логи в логи всякие характеристики объектов, в том числе и тогда, когда объект==null :)

Можно было бы еще возвращать из функции что-то вроде Either, где Left - это результат метода, а Right - описание исключения.

Но нам, энтерпрайзным быдлокодерам функциональное программирование не положено, поэтому "пишите на чем есть, мойша иванович, и не выпендривайтесь".

Date: 2008-11-30 02:57 pm (UTC)
From: [identity profile] raydac.livejournal.com
не хватает задач в которых выигрышь от использования ФЯ был бы очевиден перед использованием ИЯ.. вот в чем заковыка то

Date: 2008-11-30 03:06 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Вывод типов и функции высшего порядка и в обычных языках бы пригодились. Но они есть только в 3.5 .NET, которого на компах большинства юзеров еще нет и заставлять их его деплоить все преимущества на нет сводит.

Date: 2008-11-30 05:05 pm (UTC)
From: [identity profile] veter-r-r.livejournal.com
Шоб вы всю жизнь отлаживали программы, в которых методы вызываются подобным образом! :)

Date: 2008-11-30 05:06 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Это как раз метод для отладки :)

Date: 2008-11-30 09:10 pm (UTC)
From: [identity profile] veter-r-r.livejournal.com
Ага. Особенно когда второй параметр безумным программистом будет формироваться динамически. Никакая IDE никогда не найдет, откуда берутся вызовы метода, если размер исходников превысит достаточно небольшой критический объем :)

Date: 2008-11-30 08:47 pm (UTC)
From: [identity profile] x-a-e-p.livejournal.com
хехе, только ФП тут ни при чём совсем. Собственно, делали такое же с помощью boost::any на плюсах и в исключительно императивном стиле.

Date: 2008-12-01 03:48 am (UTC)
From: [identity profile] molnij.livejournal.com
эм, а в чем проблема написать это на нефункциональном языке?
ну кроме того, что при неизвестном прототипе, неясно, с какими параметрами вызывать метод(хотя как это решается в функциональном - тоже слабо представляю)

Date: 2008-12-01 06:56 am (UTC)
From: [identity profile] metaclass.livejournal.com
В том то и дело, что при наличии вывода типов знать прототип не обязательно.
Комбинация функции и метода просто даст функцию с типом, зависящим от типа объекта и метода.

Date: 2008-12-01 08:24 am (UTC)
From: [identity profile] molnij.livejournal.com
м, я или недопонял, или не о том.
"Функция выполняет метод, и возвращает его результат в виде строки"
С какими аргументами твоя функция предполагает вызывать метод? и как она предполагает угадывать эти параметры?

Date: 2008-12-01 08:32 am (UTC)
From: [identity profile] metaclass.livejournal.com
А, функция высшего порядка из объекта и его метода делает функцию, с параметрами, совпадающими с параметрами метода.
Например тот же самый долбаный ToString() в .net - его можно было бы заменить методом который сначала проверяет объект на !=null а затем уже вызывает.
В общем-то, в 3.5 .NET такое уже есть, extension methods, но пока на него не перейдешь, юзера задолбуться деплоить.

Date: 2008-12-02 04:16 am (UTC)
From: [identity profile] molnij.livejournal.com
м... если не трудно, еще одну итерацию объяснения можешь провести?
есть какой-то объект MyObject. у него метод function multiply(a,b: integer): integer; который возвращает результат умножения своих аргументов.
Мы отдаем их в суперфункцию: SuperFunc(MyObject, myltiply), которая должна в ответ вернуть строку с результатом.
Я по прежнему не могу понять, откуда берет SuperFunc значения для a и b...

Date: 2008-12-02 09:50 am (UTC)
From: [identity profile] metaclass.livejournal.com
Не, строку с результатом оно вернет, если мы ему передали объект и метод типа ToString() у которого ноль входных параметров и строка в качестве результата.
А если передать Multiply, то функция вернет функцию у которой будет два входных параметра и один выходной.

Date: 2008-12-02 12:56 pm (UTC)
From: [identity profile] molnij.livejournal.com
ага, теперь дошло :)
спасибо )

Date: 2008-12-01 06:29 am (UTC)
From: [identity profile] migmit.vox.com (from livejournal.com)
В OOHaskell, по-моему, можно такое сделать.

Date: 2008-12-01 08:57 am (UTC)
From: [identity profile] zmila.livejournal.com
в javascript есть call/apply (с переменным числом параметров или с одним массивом параметров)
то что нужно?

Date: 2008-12-01 09:00 am (UTC)
From: [identity profile] metaclass.livejournal.com
Типа такого, да.

Date: 2009-01-09 09:12 pm (UTC)
From: [identity profile] zamotivator.livejournal.com
template< typename F >
void log( F f, std::string file, std::size_t line )
{
std::ostringstream description;
try
{
description << f();
}
catch( std::exception& e )
{
description << "Exception: " << e.what();
}
logFile << file << " : " << line << description.str();
} 
#define LOG( f ) log( f, __FILE__, __LINE __ )

LOG(boost::bind( &Multiply, left, right ));

Date: 2009-01-10 08:11 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ты меня когда-нибудь доубедишь, что я на С++ перейду, вместо жаб, дотнетов и прочего :)

Date: 2009-01-10 10:13 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Не стоит. В С++ есть другие проблемы - ошибка в коде - это падение, а не исключение, далее нету унифицированных типов данных для СУБД, программы и GUI и так далее.
В другой стороны - Qt выглядит интересной альтернативой (GUI, SQL, Model-View-Controller). А python + pyqt - ещё более интересной. Но DataGrid из коробки (в понимании дотНета по крайней мере) там нету (на мой взгляд). Сделать-то (поминая задачку про адресную книгу) несложно, но разово такого сорта вещи сделать надо будет.
С другой стороны - у любой компании всегда есть накопленная библиотека собственноручно написанных компонент, да и в интернете Qtшные компоненты попадаются.
И даже в QtDesigner их можно проинтегрировать (если есть желание)...
В общем... Резюмируя: Qt является достойным конкурентом Delphi, Java, .NET. Юзать её можно в C++, Python, Java, Haskell даже кажется - это вполне разумная интеграция _хорошей_ библиотеки, иначе бы народ не парился на этот счёт.
Минусы - это лицензия Qt, покупать для закрытого софта надо.
В общем... Решайте сами =)
З.Ы.: Питон обусцируется легко, но не легче дотНета, с другой стороны на целевой машине сорцы нужны чтобы *.pyc собрать. Однако никто не мешает написать миниатюрный рантайм, что будет расшифорвать сорцы, компилять, и складывать на диск результаты компиляции, а сами сорцы держать зашифрованными.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 8th, 2025 04:49 am
Powered by Dreamwidth Studios