среда, 16 июля 2014 г.

Неудобство в akka

Хоть к akka отношение у меня не самое лучшее (http://itech-notes.blogspot.com/2013/01/java.html),  тем не менее, порой приходится с ней сталкиваться и даже работать. Далее один маленький вброс на тему неудобств этой самой работы.

Думаю, разработчиков, которые не хотели бы получать предупреждение об имеющихся в коде ошибках уже на этапе компиляции исходного кода, наберётся немного. Та же java очень в этом плане developer-friendly: пытаешься получить извне private поле, передать при обращении к методу лишнюю переменную, вызвать несуществующий конструктор? Сам дурак, но вот тебе ошибка компиляции, иди учи матчасть и разбирайся.

Но даже java не может ничем помочь, когда речь идёт об akka. И вот подтверждение тому.

Пусть у нас был какой-то актор:
public class ExampleActor extends UntypedActor {
     ...
}
И создавался где-то он так:
ActorRef exampleActor = getContext().actorOf(Props.create(ExampleActor.class), "example");
И было всё хорошо. А потом какой-то разработчик - не важно, кто именно - добавил в исходный актор конструктор:
    public ExampleActor(ActorRef clientActor) {
        this.
clientActor = clientActor;
    }
Добавил, собрал проект, откомпилировал, думает "всё в порядке!". Ан-нет, при старте получает злые ругательства:
ERROR [akka.actor.OneForOneStrategy] (akka.actor.default-dispatcher-9) no matching constructor found on class by.father.package.actor.ExampleActor for arguments []: akka.actor.ActorInitializationException: exception during creation
     at akka.actor.ActorInitializationException$.apply(Actor.scala:218) [akka-actor_2.10-2.2.3.jar:2.2.3]
     at akka.actor.ActorCell.create(ActorCell.scala:578) [akka-actor_2.10-2.2.3.jar:2.2.3]
     ...
Caused by: java.lang.IllegalArgumentException: no matching constructor found on class by.father.package.actor.ExampleActor for arguments []
     at akka.util.Reflect$.error$1(Reflect.scala:81) [akka-actor_2.10-2.2.3.jar:2.2.3]
     ...
Мол, нет такого конструктора! Ясное дело, что нет. Но это уже потом ясно, когда при разбирательстве окажется, что его нет, и что создание актора надо было поправить так:
ActorRef clientActor = ...;
ActorRef exampleActor = getContext().actorOf(Props.create(ExampleActor.class, clientActor), "example"); 
Но компиляция-то прошла!..
 
В общем, есть замечательная мысль - чем раньше выявляется ошибка, тем дешевле её исправление. Так вот зачем использовать фреймворк, который не только не помогает, но даже противится этой мысли?

Комментариев нет:

Отправить комментарий