На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (7) « Первая ... 5 6 [7]  все  ( Перейти к последнему сообщению )  
> ООП: что главнее, матрица или вектор
    Цитата MyNameIsIgor @
    Цитата D_KEY @
    Вот, например, тип квадрата теоретически мог бы задаваться предикатом над прямоугольником(а тот в свою очередь предикатом над многоугольником и т.д.)

    Как этот предикат соотносится с системой типов языка?

    Вроде scheme умеет создавать типы по предикатам. Тут нужен korvin

    Добавлено
    Цитата MyNameIsIgor @
    ибо нам по каким-то причинам не захотелось выразить очевидное отношение.

    Нам этого не захотелось делать, потому что мы не можем нормально соблюдать инварианты базы и/или не усилить предусловия и/или не ослабить постусловия базовых методов. Проще говоря, у нас разный набор операций, т.е. в нашей модели квадраты не являются видами прямоугольников...
      Цитата D_KEY @
      Нам этого не захотелось делать, потому что мы не можем нормально соблюдать инварианты базы и/или не усилить предусловия и/или не ослабить постусловия базовых методов

      На самом деле, не вижу подобных проблем, если мы можем переопределить все необходимые методы.
      Цитата D_KEY @
      т.е. в нашей модели квадраты не являются видами прямоугольников...

      ... но по твоим же словам являются таковыми в предметной области, и, конечно, ООП не виновато, что наша система не отражает предметную область :crazy: Хорошо, я понял правила.
        Цитата MyNameIsIgor @
        Цитата D_KEY @
        Нам этого не захотелось делать, потому что мы не можем нормально соблюдать инварианты базы и/или не усилить предусловия и/или не ослабить постусловия базовых методов

        На самом деле, не вижу подобных проблем, если мы можем переопределить все необходимые методы.

        Это делает не применимым наследование согласно принципу подстановки. В нашем примере все портят возможные методы изменения одной из сторон прямоугольника.

        Цитата
        Цитата D_KEY @
        т.е. в нашей модели квадраты не являются видами прямоугольников...

        ... но по твоим же словам являются таковыми в предметной области

        Но для нашей модели предметной области это не существенно. Если существенно, нужно было так и проектировать.

        Цитата
        и, конечно, ООП не виновато, что наша система не отражает предметную область :crazy: Хорошо, я понял правила.

        Наша система должна отражать предметную область только в той степени, в которой нам это необходимо для успешного моделирования задачи(и потенциального ее расширения и уточнения). Нет?
          Цитата D_KEY @
          Вроде scheme умеет создавать типы по предикатам.

          Racket, если точнее. Впрочем как и любой динамически-типизированный язык, по понятным причинам. Так что это сложно назвать типами в привычном смысле этого слова.

          ExpandedWrap disabled
            #lang racket
             
            (define/contract (natural? x) predicate/c
              (and (integer? x)
                   (positive? x)))
             
            (define/contract (natural+ x y) (natural? natural? . -> . natural?)
              (+ x y))
             
            (displayln (natural+ 1 2))
            (displayln (natural+ 1.2 3))

          ExpandedWrap disabled
            3
            . . ..\..\Program Files\Racket\collects\racket\contract\private\blame.rkt:135:0: natural+: contract violation
              expected: natural?
              given: 1.2
              in: the 1st argument of
                  (-> natural? natural? natural?)
              contract from: (function natural+)
              blaming: anonymous-module
              at: unsaved-editor2793:7.18
            >


          Другое дело, что в Racket можно создавать полноценно новые типы на основе существующих, что вряд ли есть хоть в каком-то динамически-типизированном языке, да и в статических не часто встречается.

          Например:

          complex.rkt:
          ExpandedWrap disabled
            #lang racket
             
            (provide/contract
             #:exists complex
             (make-complex (-> number? number? complex))
             (real-part (-> complex number?))
             (imag-part (-> complex number?)))
             
            (define (make-complex real imag)
              (cons real imag))
             
            (define (real-part c)
              (car c))
             
            (define (imag-part c)
              (cdr c))

          test.rkt:
          ExpandedWrap disabled
            #lang racket
             
            (require "complex.rkt")
              
            (define c (make-complex 1 2))
            (printf "~a+~ai\n" (real-part c) (imag-part c))
            (printf "~a+~ai\n" (car c) (cdr c))


          ExpandedWrap disabled
            1+2i
            . car: contract violation
              expected: pair?
              given: #<complex/∃>
            >


          Добавлено
          Цитата D_KEY @
          Наша система должна отражать предметную область только в той степени, в которой нам это необходимо для успешного моделирования задачи(и потенциального ее расширения и уточнения). Нет?

          А как же повторное использование? Как же библиотеки? Т.е. мы не можем (в ряде случаев) просто написать библиотеку классов, которая бы везде подходила?
            Цитата korvin @
            А как же повторное использование?

            Ну так используй повторно, если оно тебе подходит. Проблема в чем?

            Цитата
            Т.е. мы не можем (в ряде случаев) просто написать библиотеку классов, которая бы везде подходила?

            В ряде случаев не можем. И не только "классов". Ты где-то видел другое?
              Квадратное равнение не является частным случаем кубического, поскольку в определении кубического уравнения особо оговорено, что коэфииент при x3 не равен нулю. Так же как в квадратном оговаривается, что не равен нулю коэффициент при x2.
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0.0885 ]   [ 14 queries used ]   [ Generated: 28.07.26, 13:12 GMT ]