member+
Статус: Не в сети Регистрация: 16.01.2004 Откуда: Estonia,Tallinn
drinkermann- писал(а):
Координаты могут быть любыми, в любой СК, на внутреннюю реализацию это НИКАК не повлияет.
А в функции не может быть любых координат ? Там только обычные могут быть, а в объектах могут быть волшебные ?
drinkermann- писал(а):
Чем интерфейс от функции отличается знаешь?
Интерфейс по сути и является функцией которая обращается к другим функциям отдавая их вывод наружу за приделы класса, ибо согласно "философии" функции которые что-то делают в классе должны быть приватными (легко заменяемыми) а публичными должны быть интерфейсы (якобы для того чтоб независимо от начинки с классом можно было работать не зная что внутри) но технически и то и другое просто функция !!!
Нет. Интерфейс является указанием компилятору, что у объекта его реализующего должна быть определенная функциональность. Не больше и не меньше. Сам интерфейс функций не имеет.
Vladson писал(а):
технически и то и другое просто функция
Нет. Просто функция существует сама по себе и применяется без контекста. Метод класса НЕВОЗМОЖЕН без объекта, это неразрывные понятия, одно без другого не может существовать. Так что метод это не просто функция. Ты рассуждаешь абсолютно неправильно.
Psilon Статья высосана из пальца и на овер90% состоит из крайностей. Нахрена нужно передавать функцию как параметр, если почти все можно сделать без этого? При этом код работает так же, а читается и понимается проще. Что плохого в шаблонах проектирования? У них есть Фатальный Недостаток?
Member
Статус: Не в сети Регистрация: 20.03.2011 Откуда: Москва
drinkermann- писал(а):
Psilon Статья высосана из пальца и на овер90% состоит из крайностей. Нахрена нужно передавать функцию как параметр, если почти все можно сделать без этого? При этом код работает так же, а читается и понимается проще. Что плохого в шаблонах проектирования? У них есть Фатальный Недостаток?
удачи написать программу решения любой оптимизационной задачи. Например, у меня есть класс, который считает оптимальное значение многомерной функции. Мне для каждой функции свой класс писать и перекомпилировать?:) Спасибо. А как же наша драгоценная инкапсуляция? А, ну да, мы можем сделать иерархию наследования и париться со всякими myMock.Call(); вместо простого кода. Но вот для ликвидации повторяющегося кода (как в примере ниже) не очень подходит:
Код:
using System; using System.Collections.Generic; using System.Drawing; using System.Linq;
namespace Cg1Model { public abstract class Shape { public Vector[] Points { get; protected set; }
Метод в объектно-ориентированном программировании — это функция или процедура
Вопросы ?
Цитата:
В зависимости от того, какой уровень доступа предоставляет тот или иной метод
Причём в ФП контролем доступа может быть не компилятор, у которого нет таких возможностей, а программист, который спроектировал приложение, и не собирается обращаться к приватным методам хотя и имеет такую возможность
Цитата:
статические методы не имеют доступа к данным объекта и для их использования не нужно создавать экземпляры
Ну а это к слову о невозможности или возможности.
У меня всё. Умываю руки. Пиво кончилось, следующие выбросы на вентилятор будут не раньше чем завтра
Psilon я написал специально "почти все". Кстати лямбды весьма пагубно сказываются на удобочитаемости кода. (Лично для меня вообще отвратительно). И кстати очень хорошо, что они у тебя в абстрактнике. Такие вещи нужно прятать подальше. Вообще я считаю, что для вычислений функциональный подход предпочтительнее объектного, но так уж сложилось, что вычислениями мне заниматься не приходится(и не хотелось бы), а использовать лямбды для каких-нить валидаций это выше моего понимания.
Vladson писал(а):
а программист, который спроектировал приложение
Это зависит от объема кода и времени его жизни. Сегодня эту функцию дергать можно, а завтра нельзя, но она где-то дергается. Короче человеку доверять нельзя никогда.
Vladson писал(а):
не хотел приводить в пример википедию
Википедия не панацея от всего, ее люди пишут, вполне возможно они разделяют твою точку зрения.
member+
Статус: Не в сети Регистрация: 16.01.2004 Откуда: Estonia,Tallinn
drinkermann- писал(а):
Сегодня эту функцию дергать можно, а завтра нельзя, но она где-то дергается. Короче человеку доверять нельзя никогда.
Можно. Интерфейсы именно для этого и придумали, и именно люди. Чтоб знать какую функцию можно трогать а какую нельзя. Так вот изобретение это не касается только ООП, это просто естественное развитие обычного проектирования. Однако в не-ООП языках интерфейс отличается от функции только названием (каким нибудь комментарием) а в ООП языках он отличается на уровне компилятора (чтоб чайники по незнанке не лезли в те функции которые лезть нельзя) что кстати проблему не решает, потому что если программист ламер, то он и так найдёт способы всё испортить, независимо ООП он пишет или простой батник...
Добавлено спустя 1 минуту 59 секунд:
drinkermann- писал(а):
ее люди пишут, вполне возможно они разделяют твою точку зрения
Это не точка зрения, это исторические факты. Так создавался ООП, и об этом пишу не только я.
Member
Статус: Не в сети Регистрация: 20.03.2011 Откуда: Москва
О чем спор? ФП вряд ли будет использоваться в промышленных масштабах, т.к. когда ты пишешь в достаточно большом проекте на ФП, то от автодополнения толку будет ноль - найти нужную функцию из 20к - сложная задача. Зачем, собственно, и была придумана инкапсуляция. Но даже если спрятать их во всяких модулях, функций (ну или методов, кому как больше нравится) интерфейсной части все равно будут тысячи. Поэтому методы относятся к конкретным объектам - больше пары десятков методов у них практически не бывает, а уж в паре десятков разобраться нетрудно.
А вот ООП с элементами ФП крайне удобная штука. Я пробовал изучать чистый ФП язык, но когда понадобилось реализовать простенькую лабораторку знакомой - так замаялся, что в итоге плюнул, и код на С у меня получился даже короче и понятнее. При этом мне все равно пришлось городить классы, чтобы дергать эти методы из гуя. Что за уродец вышел, можно посмотреть ниже. А на С это все получилось намного аккуратней:
Код:
open System
type Solver(f:float[]->float,n,A,B,epsilon) = class let DichotomySolve (f:float->float)= (* single parameter optimization for coordinate descent method *) if B <= A then failwith "Error" else let middle a b = (a+b)/2. let l = epsilon let epsilon = l / 10.; let rec func (a,b) = let middle = middle a b let lambda, mu = middle - epsilon, middle + epsilon if b - a < l then middle else let flambda, fmu = f lambda, f mu if f lambda < f mu then func(a, mu) else func(lambda, b) func (A,B) let ( .* ) (a:float) (vector:float[]) = vector |> Array.map (fun x->x * a) let ( .+ ) (a:float) (vector:float[]) = vector |> Array.map (fun x->x + a) let ( |- ) (X:float[]) (Y:float[]) = Array.map2(fun x y -> x - y) X Y let ( |+ ) (X:float[]) (Y:float[]) = Array.map2(fun x y -> x + y) X Y let ( |* ) (X:float[]) (Y:float[]) = Array.map2(fun x y -> x * y) X Y |> Array.sum let Norm vector:float = vector |* vector |> sqrt let ( ./) (vector:float[]) (a:float) = (1./a) .* vector member this.Solve = let d = Array.init n <| fun i -> Array.init n <| fun index -> if index = i then 1. else 0. let newLambda (y:float[]) j lambda = f <| y.[j] .+ lambda .* d.[j] let newD (newLambda:float[]) = let a = Array.init n <| fun j -> if (newLambda.[j] = 0.) then d.[j] else let summand i = newLambda.[i] .* d.[i] let summands = Array.init n (fun i -> summand(i)) let res = Seq.skip <| j <| Seq.ofArray summands Seq.fold (fun acc elm -> acc |+ elm) <| Array.zeroCreate n <| res let b = Array.init n <| fun j -> if (j = 0) then a.[j] else let add = Array.init <| j <| fun i -> (a.[j-1] |* d.[i]) .* d.[i] let summand = Array.fold (fun acc elm -> acc |+ elm) (Array.zeroCreate n) add a.[j] |- summand let result = b |> Array.map (fun b -> b ./ Norm b ) let proof = result.[0] |* result.[1] d let rec solve y d = let x = y let newLambdas = Array.zeroCreate n (* Array.init n <| fun j -> DichotomySolve <| newLambda y j *) let mutable my = y for i in [0..n-1] do let newLambda = DichotomySolve <| newLambda my i my.[i] <- my.[i] + newLambda let newX = my let delta = newX |- x; let norm = delta |> Norm
if norm < epsilon then newX else solve <| newX <| newD newLambdas let starty = Array.zeroCreate n starty.[1] <- 3.; solve <| starty <| d end
[<EntryPoint>] let main argv = let f (x : float[]) = (x.[0] - 2.)**4. + (x.[0] - 2. * x.[1])**2.//(x.[0] - 1.)**2. + (x.[1] - 2.)**2.// + (x.[2] + 2.)**2. let a = new Solver(f, 2, -10.,10.,0.01) printfn "%A" a.Solve Console.ReadKey() |> ignore 0 // exit code
_________________ I would tell you a joke about UDP, but you probably wouldn't get it.
Это не точка зрения, это исторические факты. Так создавался ООП, и об этом пишу не только я.
Да тебе что в лоб, что по лбу. Как только ты думаешь о том как там что внутри, ты перестаешь находиться в ООП и перемещаешься в ассемблер(ну или куда-то во внешний мир, который уже не является объектно-ориентированным).
Psilon гибриды это от лукавого. Что-то мне подсказывает, что внешний модуль юзать правильнее, чем мешать объектный код с функциональным. Линки даже на 1\10 не юзал, для меня они остались как некий аналог хибернейта в шарпе. Даже если когда-нибудь придется использовать лямбды(а ведь придется ибо они скоро и в яве появятся), то все равно использовать их буду минимально. Лучше код на 300 строк, но в котором можно разобраться, чем код в 100 строк в котором черт ногу сломит. Я и укороченной записью условий не пользуюсь практически, по тем же соображениям.
Member
Статус: Не в сети Регистрация: 07.01.2010 Откуда: Одинцово
еле осилил прочесть весь холивар уж извиняйте, не хотел я ентого! по теме остановился-таки на C#, по нескольким причинам: - один из ведущих языков - венда была, есть и будет востребованной - уже знаком с ФП, байтами, битами, указателями и тд. - отличная бесплатная среда разработки Visual Studio Express - при необходимости перейти на Java не составит труда
member+
Статус: Не в сети Регистрация: 16.01.2004 Откуда: Estonia,Tallinn
proforza писал(а):
уж извиняйте
Ты не виноват, мне просто похоливарить захотелось, если бы не ты, я бы другой повод нашёл
А выбор уважаю. С# вполне годный язык, огромный плюс что на нём можно писать мелкие программки даже на голой ОС без всяких студий (компилятор входит в .NET который уже входит в винду и установлен на 99% компов) нет проблем с поиском документации, полно форумов где можно спросить советов, итд.
Member
Статус: Не в сети Регистрация: 20.03.2011 Откуда: Москва
Vladson уже год как пилю Asp.Net, SharePoint,... - это не очень "мелкие программки"
proforza лучший выбор, на самом деле. Хотя я с дельфи начинал, там проще понять работу с указателями и битое***м. Конечно это в шарпе не очень пригождается, но вот при декомпиляции очень помогает понять что к чему. Но и так тоже неплохо.
Просто сразу ООП - это сложно, можно заработать ООП головного мозга (ну вы понели... )
Добавлено спустя 2 минуты 58 секунд: proforza даже больше скажу, можно зарегаться по бесплатной программе от МС и получить VS professional бесплатно, dreamSpark вроде. Хотя там написано, что только для студентов, я в свое время получал просто как разраб. Три года бесплатно можно юзать софт (до уровня professional), а затем предлагают продление подписки, 100$ в год.
_________________ I would tell you a joke about UDP, but you probably wouldn't get it.
member+
Статус: Не в сети Регистрация: 16.01.2004 Откуда: Estonia,Tallinn
Psilon писал(а):
уже год как пилю Asp.Net, SharePoint,... - это не очень "мелкие программки"
Можно пилить не мелкие, а можно мелкие... Я как-то захотел написать прогу которая двигала бы мышкой (для онлайн игры) с нужной скоростью в нужные места, так вот в 20 строчек кода в блокноте накатал, на месте (на чужом компе где никаких студий не было) из командной строки компильнул, и готово, всё работает
Добавлено спустя 2 минуты 30 секунд:
Psilon писал(а):
я с дельфи начинал
Я с бейсика начинал в 89-м где-то году, возможно в 88-м...
Member
Статус: Не в сети Регистрация: 07.01.2010 Откуда: Одинцово
Vladson писал(а):
Ты не виноват, мне просто похоливарить захотелось, если бы не ты, я бы другой повод нашёл
Psilon писал(а):
proforza лучший выбор, на самом деле. Хотя я с дельфи начинал, там проще понять работу с указателями и битое***м. Конечно это в шарпе не очень пригождается, но вот при декомпиляции очень помогает понять что к чему. Но и так тоже неплохо.
Просто сразу ООП - это сложно, можно заработать ООП головного мозга (ну вы понели... )
В принципе я все это уже более менее освоил на примере языка с++, поэтому решил сразу ООП ковырять.
Vladson писал(а):
proforza даже больше скажу, можно зарегаться по бесплатной программе от МС и получить VS professional бесплатно, dreamSpark вроде. Хотя там написано, что только для студентов, я в свое время получал просто как разраб. Три года бесплатно можно юзать софт (до уровня professional), а затем предлагают продление подписки, 100$ в год.
Я в свое время упустил такую возможность, надо будет на брата зарегистрироваться, там вроде не только VS на халяву, но и венда, офис, и пр.
Member
Статус: Не в сети Регистрация: 08.08.2008 Фото: 3
Решил попасть в IBA. Немного Java уже освоил, но всего по-немногу и поверхностно. Столкнувшись с тестом у них на офисе понял, что нужно более глубокое понимание таких простых вещей, как наследование, блоки и пр., и знание всяких специфичных простеньких классов, типа Thread. Так вот, существуют ли какие-то специальные самостоятельные курсы, заточенные именно под IBA? Я слышал, они и сами их устраивают, но попасть на них у меня нет возвожности. P.S. Сперва хотел создать отдельную тему, но пока так.
_________________ Была картошка простая - стала золотая, были грибки простые - стали золотые, была рыбка простая - стала золотая. Еле процессоры спасли!
Member
Статус: Не в сети Регистрация: 20.03.2011 Откуда: Москва
Зю по-моему вообще бесполезно учить какие-то куски взаимосвязанного языка. Нужно понимать цельные концепции, хотя бы на примере одного языка. А "вот кусок джавы, выучите, сможете побыдлокодить" - бред жеж.
_________________ I would tell you a joke about UDP, but you probably wouldn't get it.
Member
Статус: Не в сети Регистрация: 08.08.2008 Фото: 3
Psilon писал(а):
Зю по-моему вообще бесполезно учить какие-то куски взаимосвязанного языка. Нужно понимать цельные концепции, хотя бы на примере одного языка. А "вот кусок джавы, выучите, сможете побыдлокодить" - бред жеж.
Так получилось, что быдлокодерству учился без намерения, некогда объяснять. Интересно, что же вы понимаете под "цельные концепции"? Звучит так... пафосно и громоздко.
_________________ Была картошка простая - стала золотая, были грибки простые - стали золотые, была рыбка простая - стала золотая. Еле процессоры спасли!
Member
Статус: Не в сети Регистрация: 20.03.2011 Откуда: Москва
Зю Понимать, почему стандарт языка такой, а не какой-то иной, просто достаточно. Тогда любой язык изучается буквально в течение недели, при необходимости. Если только это не сверхпонятный J или APL какой-нибудь.
Цитата:
Полезно разделять концепции и синтаксис
word
_________________ I would tell you a joke about UDP, but you probably wouldn't get it.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения