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




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1137 • Страница 56 из 57<  1 ... 53  54  55  56  57  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
drinkermann- писал(а):
Координаты могут быть любыми, в любой СК, на внутреннюю реализацию это НИКАК не повлияет.

А в функции не может быть любых координат ? Там только обычные могут быть, а в объектах могут быть волшебные ?
drinkermann- писал(а):
Чем интерфейс от функции отличается знаешь?

Интерфейс по сути и является функцией которая обращается к другим функциям отдавая их вывод наружу за приделы класса, ибо согласно "философии" функции которые что-то делают в классе должны быть приватными (легко заменяемыми) а публичными должны быть интерфейсы (якобы для того чтоб независимо от начинки с классом можно было работать не зная что внутри) но технически и то и другое просто функция !!!

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G



Партнер
 

Member
Статус: Не в сети
Регистрация: 10.02.2013
Vladson писал(а):
Интерфейс по сути и является функцией

Нет. Интерфейс является указанием компилятору, что у объекта его реализующего должна быть определенная функциональность. Не больше и не меньше. Сам интерфейс функций не имеет.
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; }
       
        public abstract bool IsVisible { get; }
       

        protected static Vector[] SelectPointsToArray(IEnumerable<Vector> points)
        {
            return points.Select(p => p.Clone()).ToArray();
        }

        protected Shape(Vector[] points)
        {
            Points = points;
        }

        public void ProcessAllPoints(Action<Vector> action)
        {
            foreach (var point in Points)
            {
                action(point);
            }
        }
       
        protected virtual void OnProcessCenter(Action<Vector> action)
        {

        }

        public void ProcessAllPointsInCenter(Action<Vector> action)
        {

            var center = Center;
            foreach (var point in Points)
            {
                point.Move(-center);
                action(point);
                point.Move(center);
            }
            OnProcessCenter(action);
        }

        public void RotateX(double angle)
        {
            ProcessAllPoints(point => point.RotateX(angle));
        }

        public void RotateY(double angle)
        {
            ProcessAllPoints(point => point.RotateY(angle));
        }

        public void RotateZ(double angle)
        {
            ProcessAllPoints(point => point.RotateZ(angle));
        }

        public void Translate(Vector vector)
        {
            ProcessAllPoints(point => point.Move(vector));
        }

        public void ReflectX()
        {
            ProcessAllPoints(point => point.ReflectX());
        }

        public void ReflectY()
        {
            ProcessAllPoints(point => point.ReflectY());
        }

        public void ReflectZ()
        {
            ProcessAllPoints(point => point.ReflectZ());
        }

        public void RotateCenterX(double angle)
        {
            ProcessAllPointsInCenter(vector => vector.RotateX(angle));
        }

        public void RotateCenterY(double angle)
        {
            ProcessAllPointsInCenter(vector => vector.RotateY(angle));
        }

        public void RotateCenterZ(double angle)
        {
            ProcessAllPointsInCenter(vector => vector.RotateZ(angle));
        }


        public void ReflectCenterX()
        {
            ProcessAllPointsInCenter(vector => vector.ReflectX());
        }

        public void ReflectCenterY()
        {
            ProcessAllPointsInCenter(vector => vector.ReflectY());
        }

        public void ReflectCenterZ()
        {
            ProcessAllPointsInCenter(vector => vector.ReflectZ());
        }
       

        public T Clone<T>() where T : Shape
        {
            var clone = (T) MemberwiseClone();
            clone.Points = clone.Points.SelectToArray(p => p.Clone());
            return clone;
        }

        public Vector Center
        {
            get
            {
                return Points.Aggregate((sum, v) => sum + v)/Points.Length;
            }
        }


        public abstract void Draw(Graphics g);

        public void Move(double dx, double dy, double dz)
        {
            var delta = new Vector(dx, dy, dz);
            ProcessAllPoints(point => point.Move(delta));
        }
    }
}

1 строчка вместо трех, умножить на 20 методов. итого 140 строк вместо 200.


После изучения ФП начинает очень нехватать функций в обычных языках. Хорошо, что в моем любимом с этим все в порядке.

Цитата:
Ты рассуждаешь абсолютно неправильно.

ookay

_________________
I would tell you a joke about UDP, but you probably wouldn't get it.


 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
Честно, не хотел приводить в пример википедию, но выбора нет... http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
Цитата:
Метод в объектно-ориентированном программировании — это функция или процедура
Вопросы ?
Цитата:
В зависимости от того, какой уровень доступа предоставляет тот или иной метод
Причём в ФП контролем доступа может быть не компилятор, у которого нет таких возможностей, а программист, который спроектировал приложение, и не собирается обращаться к приватным методам хотя и имеет такую возможность
Цитата:
статические методы не имеют доступа к данным объекта и для их использования не нужно создавать экземпляры

Ну а это к слову о невозможности или возможности.

У меня всё. Умываю руки. Пиво кончилось, следующие выбросы на вентилятор будут не раньше чем завтра :)

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 20.03.2011
Откуда: Москва
Vladson а причем тут статические методы? Это просто методы объекта-типа. У него и поля могут быть... И все что угодно. Вплоть до конструктора :)

_________________
I would tell you a joke about UDP, but you probably wouldn't get it.


 

Member
Статус: Не в сети
Регистрация: 10.02.2013
Psilon я написал специально "почти все". Кстати лямбды весьма пагубно сказываются на удобочитаемости кода. (Лично для меня вообще отвратительно).
И кстати очень хорошо, что они у тебя в абстрактнике. Такие вещи нужно прятать подальше.
Вообще я считаю, что для вычислений функциональный подход предпочтительнее объектного, но так уж сложилось, что вычислениями мне заниматься не приходится(и не хотелось бы), а использовать лямбды для каких-нить валидаций это выше моего понимания.

Vladson писал(а):
а программист, который спроектировал приложение

Это зависит от объема кода и времени его жизни. Сегодня эту функцию дергать можно, а завтра нельзя, но она где-то дергается. Короче человеку доверять нельзя никогда.

Vladson писал(а):
не хотел приводить в пример википедию

Википедия не панацея от всего, ее люди пишут, вполне возможно они разделяют твою точку зрения.


 

Member
Статус: Не в сети
Регистрация: 20.03.2011
Откуда: Москва
drinkermann- всякие вкусности а-ля LINQ целиком построены на лямбдах, и это крайне удобно.

И мне, например, давно уже привычно с ними работать. Дело вкуса, вроде рубивских отступов вместо скобочек. Кому-то удобнее, кому-то нет.

_________________
I would tell you a joke about UDP, but you probably wouldn't get it.


Последний раз редактировалось Psilon 15.11.2013 23:11, всего редактировалось 1 раз.

 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
drinkermann- писал(а):
Сегодня эту функцию дергать можно, а завтра нельзя, но она где-то дергается. Короче человеку доверять нельзя никогда.

Можно. Интерфейсы именно для этого и придумали, и именно люди. Чтоб знать какую функцию можно трогать а какую нельзя. Так вот изобретение это не касается только ООП, это просто естественное развитие обычного проектирования. Однако в не-ООП языках интерфейс отличается от функции только названием (каким нибудь комментарием) а в ООП языках он отличается на уровне компилятора (чтоб чайники по незнанке не лезли в те функции которые лезть нельзя) что кстати проблему не решает, потому что если программист ламер, то он и так найдёт способы всё испортить, независимо ООП он пишет или простой батник...

Добавлено спустя 1 минуту 59 секунд:
drinkermann- писал(а):
ее люди пишут, вполне возможно они разделяют твою точку зрения

Это не точка зрения, это исторические факты. Так создавался ООП, и об этом пишу не только я.

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

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.


 

Member
Статус: Не в сети
Регистрация: 10.02.2013
Vladson писал(а):
Это не точка зрения, это исторические факты. Так создавался ООП, и об этом пишу не только я.

Да тебе что в лоб, что по лбу. Как только ты думаешь о том как там что внутри, ты перестаешь находиться в ООП и перемещаешься в ассемблер(ну или куда-то во внешний мир, который уже не является объектно-ориентированным).

Psilon гибриды это от лукавого. Что-то мне подсказывает, что внешний модуль юзать правильнее, чем мешать объектный код с функциональным.
Линки даже на 1\10 не юзал, для меня они остались как некий аналог хибернейта в шарпе. Даже если когда-нибудь придется использовать лямбды(а ведь придется ибо они скоро и в яве появятся), то все равно использовать их буду минимально. Лучше код на 300 строк, но в котором можно разобраться, чем код в 100 строк в котором черт ногу сломит. Я и укороченной записью условий не пользуюсь практически, по тем же соображениям.


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
Откуда: Одинцово
еле осилил прочесть весь холивар :roll: уж извиняйте, не хотел я ентого! :D
по теме
остановился-таки на C#, по нескольким причинам:
- один из ведущих языков
- венда была, есть и будет востребованной
- уже знаком с ФП, байтами, битами, указателями и тд.
- отличная бесплатная среда разработки Visual Studio Express
- при необходимости перейти на Java не составит труда

как-то так :writer:


 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
proforza писал(а):
уж извиняйте

Ты не виноват, мне просто похоливарить захотелось, если бы не ты, я бы другой повод нашёл :)

А выбор уважаю. С# вполне годный язык, огромный плюс что на нём можно писать мелкие программки даже на голой ОС без всяких студий (компилятор входит в .NET который уже входит в винду и установлен на 99% компов) нет проблем с поиском документации, полно форумов где можно спросить советов, итд.

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

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-м...

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
Откуда: Одинцово
Vladson писал(а):
Ты не виноват, мне просто похоливарить захотелось, если бы не ты, я бы другой повод нашёл

:haha:

Psilon писал(а):
proforza лучший выбор, на самом деле. Хотя я с дельфи начинал, там проще понять работу с указателями и битое***м. Конечно это в шарпе не очень пригождается, но вот при декомпиляции очень помогает понять что к чему. Но и так тоже неплохо.

Просто сразу ООП - это сложно, можно заработать ООП головного мозга (ну вы понели... )

В принципе я все это уже более менее освоил на примере языка с++, поэтому решил сразу ООП ковырять.

Vladson писал(а):
proforza даже больше скажу, можно зарегаться по бесплатной программе от МС и получить VS professional бесплатно, dreamSpark вроде. Хотя там написано, что только для студентов, я в свое время получал просто как разраб. Три года бесплатно можно юзать софт (до уровня professional), а затем предлагают продление подписки, 100$ в год.

Я в свое время упустил такую возможность, надо будет на брата зарегистрироваться, там вроде не только VS на халяву, но и венда, офис, и пр. :beer:


 

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+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
Psilon писал(а):
бесполезно учить какие-то куски взаимосвязанного языка

Полезно разделять концепции и синтаксис, если получится то можно выучив кусок явы понять кусок брейнфака раннее не понятый и наоборот.

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 20.03.2011
Откуда: Москва
Зю Понимать, почему стандарт языка такой, а не какой-то иной, просто достаточно. Тогда любой язык изучается буквально в течение недели, при необходимости. Если только это не сверхпонятный J или APL какой-нибудь.
Цитата:
Полезно разделять концепции и синтаксис

word

_________________
I would tell you a joke about UDP, but you probably wouldn't get it.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1137 • Страница 56 из 57<  1 ... 53  54  55  56  57  >
-

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


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

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


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

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan