Здравствуйте, mkizub, Вы писали:
M>Здравствуйте, aka50, Вы писали:
VD>>>>>>4. Если думали, но есть останавливающие факторы, то просьба их перечислить. Причем любые, даже сугубо субъективные.
M>>>>>Несогласие с базовой концепцией, тормознутость.
M>>>Он и без JVM был-бы накладный, а на яве, с её невозможностью низкоуровневого программирования — и подавно.
M>>>[skip] решения разработчиков Scala меня лишь удручают.
A>>Очень интересно, хотелось бы подробностей (то, что я успел посмотреть мне пока не показалось чем-то сильно страшным).
M>1. Тип описывается сигнатурой всех методов. Это, по моему, просто не правильно.
Тип (наиболее близок к typeclass): набор сигнатур и констант которые должны быть в классах данного типа.
А что по твоему должно быть типом? (не забывай еще, что нужно поддерживать раздельную компиляцию).
M>Если у меня есть два класса (интерфейса) с методом getSize(), то это не значит, что они одинаковые.
M>Эти методы могут быть семантически разные. Скажем, один возвращает количество в штуках, а другой возвращает
M>площать в метрах квадратных.
Это сделано из соображений совместимости с jvm. И собственно, а что это будет за объект, который имеет size сразу и в kg и в sqm (при чем не преобразуемых, т.к. методы разных сущностей)?
M>2. Делать из методов объекты — это удобно, иногда, но это жуткий оверхед.
Это ты о чем? Методы как методы, только когда мы хотим передать метод куда-то, тогда да, рожается объект... Ну и анонимные функции тоже превращаются в объекты.
object test {
class A {
def myMethod() = println("hello")
def myAnotherMethod() = println("hello")
}
class B(a: A) {
def myTest() = (1 :: 2 :: Nil) map (_ + 1)
def mySuper() = a.myAnotherMethod _
}
}
target
|-- test$.class
|-- test$A.class
|-- test$B$$anonfun$0.class
|-- test$B$$anonfun$1.class
|-- test$B.class
`-- test.class
$ javap test\$A
Compiled from "methods.scala"
public class test$A extends java.lang.Object implements scala.ScalaObject{
public test$A();
public void myAnotherMethod();
public void myMethod();
public int $tag();
}
$ javap test\$B
Compiled from "methods.scala"
public class test$B extends java.lang.Object implements scala.ScalaObject{
public final test$A test$B$$a;
public test$B(test$A);
public scala.Function0 mySuper();
public scala.List myTest();
public int $tag();
}
$ javap test\$B\$\$anonfun\$0
Compiled from "methods.scala"
public final class test$B$$anonfun$0 extends java.lang.Object implements scala.Function1,scala.ScalaObject,java.io.Serializable{
public test$B $outer;
public test$B$$anonfun$0(test$B);
public final java.lang.Object apply(java.lang.Object);
public test$B test$B$$anonfun$$$outer();
public final int apply(int);
public int $tag();
public scala.Function1 andThen(scala.Function1);
public scala.Function1 compose(scala.Function1);
public java.lang.String toString();
}
M>3. Лепить во все места view-s — это удобно для code reuse, но это жуткий оверхед.
Не вижу оверхеда. Тот же код, что вынесен во view будет просто писаться руками. Учитывая, что view обычно разботают на границе компонент, это не страшно...
Ну и собственно "жуткий оверхед" — это сколько в цифрах? В java повсеместно используются анонимные классы и ничего... здесь фактически тоже самое...
M>Вообще, создатели языков вынуждены делать выборы, которые определяют область использования языка.
Не совсем. Scala — одна из задач, это совместимость с java. Отсюда и определенные ограничения.