1. Куча / Говнокод #14165

    +130

    1. 1
    class Int extends Float {}

    http://haxe.ru/ref-base_types

    Запостил: someone, 02 Декабря 2013

    Комментарии (21) RSS

    • конечно же, дискретное есть частный случай рационального....
      Ответить
    • Ну у этого есть причина... потому что в ж.скрипте целых нет, а компилировать в него как-то нужно, вот и получили такую нелепость.
      Ответить
      • Это называется "детали реализации". Проблему можно решить другим способом - композицией, например. А так нарушается принцип подстановки Лисковой, потому что к целым числам применимы не все операции, имеющие смысл для вещественных.
        Ответить
        • > потому что к целым числам применимы не все операции, имеющие смысл для вещественных
          Этож какие?
          Ответить
        • > принцип подстановки Лисковой
          Только сейчас понял, что Барбара Лисков не мужик. о.0
          Ответить
          • Барбара разве может быть мужским именем?

            Оффтоп: местные овцушки мужику выдали паспорт, в котором написано Кузьма Ивановна...
            Ответить
            • http://www.ivid.it/fotogallery/imagesearch/images/scuola_di_polizia_steve_guttenberg_hugh_wilson_007_jpg_ajiw.jpg
              Ответить
            • > Барбара разве может быть мужским именем?
              Liskov substitution principle
              Имя редко где упоминается. Вполне можно представлять в голове бородатого профессора Лискова.
              Ответить
              • Да вот я всегда так думал... Пока, внезапно, не узнал, что она Барбара :)
                Ответить
                • Кстати, тех. лиды в 99% спрашивают о принципе Лискова
                  Ответить
                  • Надо задавать на собеседовании подлый вопрос - кто такой Лисков.
                    Ответить
        • Тут нет проблемы же. Инт и флоат - стандартные типы и с инми так делать нельзя.
          http://try.haxe.org <- введите сюда этот замечательный код и:
          Build failure
          Type name Int is redefined from module StdTypes


          Как я и говорил ниже - проблема в голове писавшего код.
          Но вы, конечно, можете продолжать обсуждать почему так придумали и как можно было сделать иначе.
          Ответить
        • > к целым числам применимы не все операции, имеющие смысл для вещественных.
          это какие? применимы все, только работают не так.
          к примеру, деление - ну есть же целочисленное деление Int -> Int, к примеру, 1/3=0
          Ответить
        • А можно пример, как решить эту проблему композицией?

          let rec classify t =
          	match follow t with
          	| TInst ({ cl_path = ([],"Int") },[]) -> KInt
          	| TInst ({ cl_path = ([],"Float") },[]) -> KFloat
          	| TInst ({ cl_path = ([],"String") },[]) -> KString
          	| TAbstract ({ a_path = [],"Int" },[]) -> KInt
          	| TAbstract ({ a_path = [],"Float" },[]) -> KFloat
          	| TAbstract (a,[])
                  when List.exists (fun t -> match classify t with
                  | KInt | KFloat -> true
                  | _ -> false)
                    a.a_super -> KParam t
          	| TInst ({ cl_kind = KTypeParameter ctl },_)
                  when List.exists (fun t -> match classify t with
                  | KInt | KFloat -> true
                  | _ -> false)
                    ctl -> KParam t
          	| TMono r when !r = None -> KUnk
          	| TDynamic _ -> KDyn
          	| _ -> KOther


          Вот решил посмотреть, как же оно реализовано на самом деле. И, на самом деле (это только пример, но во всех остальных местах по коду целые и вещественные обрабатываются отдельно / никто не делает предположений о том, что одно является подклассом другого). Так что, наверное, все-таки это инициатива автора статьи.
          Еще, как вариант, статья могла быть написана очень давно, когда Int / Float действительно были определены в стандартной библиотеке http://haxe.org/ref/basic. (В настоящем варианте стандартной библиотеки определений Int / Float нет, но рефлектор, например, считает их разными типами.)

          enum ValueType {
          	TNull;
          	TInt;
          	TFloat;
          	TBool;
          	TObject;
          	TFunction;
          	TClass( c : Class<Dynamic> );
          	TEnum( e : Enum<Dynamic> );
          	TUnknown;
          }
          Ответить
          • Мне кажется, что я нашел откуда происходит это недоразумение.
            Впервые эта строчка встречается в 2008 году, в первой ревизии страницы с текстом.
            http://haxe.org/ref/basic?version=8 version #8, modified 2008-05-01 21:50:41 by ncannasse

            Согласно истории ревизий, это период после 1.19 (2008-04-05), но до RC 2 (2008-07-17). Некоторые изменения второй ветки, предполагают, как мне кажется, разделение типов целых и рациональных чисел:
            (2008-11-23: 2.02) fixed issue with Int default value for Float parameter
            (2009-03-22: 2.03) optimizer : reduce constant int/float/bool expressions and immediate function calls
            https://github.com/HaxeFoundation/haxe/blob/development/doc/CHANGES.txt

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

            кстати, с третьей версии базовые типы внезапно абстрактны:
            (2013-02-24: 3.0.0-RC) added abstract types (Int/Float/Bool/Void/Class/Enum/EnumValue)
            Ответить
    • api.haxe.org говорит нам:
      Float	The standard Float type, this is a double-precision IEEE 64bit float.
      Int	The standard Int type. Its precision depends on the platform.

      Что явно указывает на сорта наполнения головушки писавшего. Впрочем, чего еще можно ожидать от упертого апологета подзаброшенной поделки опенсорсных лямбда-самцов?
      Ответить
    • Там в конце кода написано </div>. Это к HaXe тоже относится??? Или верстальщики ериворукие? :D
      Ответить

    Добавить комментарий