Хоть к 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");
Но компиляция-то прошла!..
В общем, есть замечательная мысль - чем раньше выявляется ошибка, тем
дешевле её исправление. Так вот зачем использовать фреймворк, который не
только не помогает, но даже противится этой мысли?
Комментариев нет:
Отправить комментарий