Как мне следовать шаблону async / donelistener (runnable), который использует Runtime, чтобы избежать монолитного блока кода или неадекватно знающих классов? - PullRequest
0 голосов
/ 11 октября 2019

Существует множество вещей, которые необходимо настроить для установки экземпляра Portal в среде исполнения, почти все из которых являются асинхронными вызовами загрузки. Заставить его работать не проблема. Может быть, я прошу ответы «в первую очередь на основе мнения», но мне действительно нужно знать, как структурировать от четырех до шести слабо зависимых действий, все из которых кажутся ожидающими всего как анонимного и встроенного вызоваследующий шаг. Я мог бы реализовать Runnable для каждой возможной необходимости загрузить все (см. Код для порядка операций), но затем я получил бы 6 различных внутренних классов, каждый из которых имел свои небольшие знания о работе моегоКласс PortalManager.

Я не супер на Java или Android. Если бы это была проблема .NET в классической форме win, и Esri настаивала на этом неудобном шаблоне кодирования, я просто создала бы модель событий / подписок с несколькими событиями, которые могли бы перечислять различные шаги загрузки, а затем подходящие методы для выполнения ожидаемой работы. .

Я не очень беспокоюсь о том, чтобы приложение работало, я стараюсь не писать хреновый код. Внедрение 400 строк кода, вложенных в шесть уровней глубины, так что, по сути, все является вызовами событий, в любом случае пахнет очень плохо. Ниже по сути то, что я делаю, но оно не может продолжать вкладывать все глубже и глубже.

public Portal getPortalInstance
{

    Portal portal = new Portal();

    //do a lot of work setting it up

    //this is equivalent to portal.addDoneLoadingListener( new Runnable() { @override public void run() {  }  }
    portal.addDoneLoadingListener( {
    () -> 



        if( portal.getLoadStatus() == LoadStatus.LOADED ){

            //do a lot of work authenticating the user

            //now set up the map instance so licensing order is correct

            //do a lot of work reading feature classes

            //get a specific feature layer
            PortalItem portalItem = getPortalItem( portal , "itemID" );

            portalItem.addDoneLoadingListener( {
            () ->
                if( portalItem.getLoadStatus() == LoadStatus.LOADED ){

                    //read the item and item feature table, get a list of available stuff
                    FeatureLayer featureLayer = new FeatureLayer( portalItem , 0 );

                    //read some attributes of the layer and do more work

                    featureLayer.addDoneLoadingListener( {
                    () ->
                        if( featureLayer.getLoadStatus() == LoadStatus.LOADED ){
                            //do a map setup call
                            //keep going into more and more code, with more inline new Runnables()
                            //feel shame at a 400 line code block that is impossible to follow
                        }
                        else{
                            //manage a feature layer load failure
                        }
                    });

                    featureLayer.loadAsync();

                }
                else{
                    //manage a portal item load failure
                }
            });

            portalItem.loadAsync();

        }
        else{

            //manage a connection failure
        }
    });

    portal.loadAsync();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...