Партнер брачные игры


Я говорю, что это правильно, потому что X может произойти и y изменение кода возможно в будущем. Более старший парень говорит вроде то же самое, за исключением вдоль линий "я прав, ты ошибаешься". Затем я отступлю, б/у Он более старший.

Здесь я реализую метод playMatingGameA(строку). Мой более старший коллега предоставляет альтернативную реализацию playMatingGameB(строку). Пожалуйста, игнорировать то, как главный объект вписывается в великой схеме вещей. Суть кодирования в один способ.

Описание проблемы: объект класса партнер должен играть в брачные игры. Вход-это брачный зов. Он берет такси, едет в бар или клуб или что-то, издает брачный зов, заигрывает и товарищей. В playMatingGame() метод не должен бросать исключение или возвращать значение. Статус строковую переменную, вместо него набор.

Строки matingCall должен быть непустым. Создание (бар) должен найти его соответствующие. Несколько вызовов метода, могут быть исключения/возвращает значение null.

Я буду заключать со своими собственными мыслями, но комментариев от других инженеров будет высоко ценится.

interface MeatMarket
{
    public Partner findPartner(String matingCall);

    public boolean isMatingCallAllower(String call)
           throws PartnerRejectionException;
} // e.g., Bar, Club, Church, etc.

class TaxiMeatMarketFactory
{
    public static MeatMarket getMeSomePlaceFun()
    throws RuntimeException; // I know, no need 2 declare
}




public abstract class Partner
{
    String name;
    // {get; set; justkiddingthisisjava;}

    private String morningAfterFeeling;

    // here B constructorz [skip]

    // . . . and the methodz
    public void flirt(Partner p)
           throws PartnerRejectionException, ParnterNotSoberException;

    public abstract void mate(Partner p)
           throws PartnerWrongSpeciesException;



    // The goal: with your given mating call, take taxi to a meatmarket
    // find a partner, flirt then mate.
    // No throwing up! No Exceptions!
    //
    // MUST return void and record morningAfterFeeling as a status.
    public void playMatingGameA(String matingCall)
    {
        morningAfterFeeling = "Great";

        if (matingCall == null || matingCall.equals(""))
        {
            morningAfterFeeling = "No voice";
            log.error(morningAfterFeeling);
            return;
        }

        MeatMarket mm = null;

        try
        {
            // might still return null. 
           mm = TaxiMeatMarketFactory.getMeSomePlaceFun();
        }
        catch(RuntimeException e)
        {
            log.error(e);
        }

        if (mm == null)
        {
            // taxi's fault either way.
            log.error("Bad taxi");
            morningAfterFeeling = "Bad taxi";
            return;
        }


        try
        {
            if (!mm.isMatingCallAllowed(matingCall))
            {
                morningAfterFeeling = "Arse kicked & thrown out";
                return;
            }
        }
        catch(PartnerRejectionException e)
        {
            morningAfterFeeling = "Bad meatmarket";
            log.error(e);
            return;
        }


        try
        {
            Partner p = mm.findPartner(matingCall);
            flirt(p);
            mate(p);
        }
        catch(PartnerRejectionException e)
        {
            morningAfterFeeling = "partner not responsive";
            log.error(e);
        }
        catch(PartnerNotSoberException e)
        {
            // here and above the partner's choices are very unwise.
            morningAfterFeeling = "partner not responsive";
            log.error(e);        
        }
        catch(PartnerWrongSpeciesException e)
        {
            // and here it's partner's physique, out of their control
            morningAfterFeeling = "Could not find partner";
            log.error(e);        
        }
        finally
        {
            if (!gotHome())
            {
                morningAfterFeeling += "Slept on street";
            }
        }

        if (!"Good".equals(morningAfterFeeling))
        {
            log.error("Terrible night out");
        }
    }



    public void playMatingGameB(String matingCall)
    {
        try
        {
            morningAfterFeeling = "Great";
            if (matingCall == null || matingCall.equals(""))
            {
                morningAfterFeeling = "No voice";
                log.error(morningAfterFeeling);
                return;
            }
            else
            {
                MeatMarket mm = TaxiMeatMarketFactory.getMeSomePlaceFun();
                if (!mm.isMatingCallAllowed(matingCall))
                {
                    morningAfterFeeling = "Ass kicked & thrown out";
                    return;
                }               
                else
                {
                    Partner p = mm.findPartner(matingCall);
                    flirt(p);
                    mate(p);
                }
            }
        }
        catch(PartnerRejectionException e)
        {
            morningAfterFeeling = "Exception: " + e.getMessage();
            log.error(e);
        }
        catch(PartnerNotSoberException e)
        {
            // here and above the partner's choices are very unwise.
            morningAfterFeeling = "Exception: " + e.getMessage();
            log.error(e);        
        }
        catch(PartnerWrongSpeciesException e)
        {
            // and here it's partner's physique, out of their control
            morningAfterFeeling = "Exception: " + e.getMessage();
            log.error(e);        
        }
        catch (Exception e)
        {
            morningAfterFeeling = "Exception: " + e..getMessage();
            log.error(e);
        }
        finally
        {
            if (!makeItHome())
            {
                morningAfterFeeling += "Slept on street";
            }

            // this clause moved here for no particular reason
            if (!"Good".equals(morningAfterFeeling))
            {
                log.error("Terrible night out");
            }   
        }
    }
}

Метод обеспечивает более подробная информация о том, что идет не так. И она держится подальше от нулевых ссылок. Я бы скорее прикоснуться к живой гремучей змеи, чем нулевое. Я научилась покончить с плохим (нуль, отрицательные и т. д.) входы в самом начале. Потом перейдем к "мясу". именно 3 строк: findPartner(), флирт(), матэ().

Его метод, безусловно, короче и вся логика умещается в один абзац, затем бросается. Где я могу проверить на пустую ссылку, он ловит исключение NullPointerException и набирает несколько строк кода таким образом. Его "мясо" включает в себя проверку ошибок логики и красиво умещается на странице. Но гораздо больше, чем 3 строчки, и это предполагает вложенных Если-нибудьов. Также обратите внимание, как линии morningAfterFeeling="хорошее" в его метод. Ее правильность зависит от общего поймать(исключение e).

Он говорит, что все мои возвращения скачков в логике. Не проблема для меня, я думаю. Если это плохо, вернуться. Все кончено. Если нет, предполагаю, что это хорошо и двигаться дальше. К тому времени вы добираетесь до мяса, вы знаете, что вы не должны беспокоиться.

П. С. Я изменил метод/имена объектов, конечно, я бы не просто скопировать и вставить собственный код. Переделывая реальные вещи в спаривание установки игры было интересное упражнение абстракции.



505
5
задан 26 октября 2011 в 04:10 Источник Поделиться
Комментарии
2 ответа

Я согласен, явно проверяя на ошибки (вместо общего отлов исключений) и не быстро или возвращается раньше, как правило, хорошие практики, как вы делали в ваш метод. Некоторые люди не любят перерыва в логику потока, но нет никаких причин, чтобы продолжать и это позволяет избежать вложенности условных операторов и/или других блоков кода. Ловить родовое исключение - это всегда красный флаг для меня-когда-нибудь тебе придется это сделать, но, как правило, есть лучший способ.

Чтобы упростить поймать блоков, вы, возможно, захотите рассмотреть вопрос о внесении суперкласса (скажем AbstractRejectionException) для всех пользовательских исключений, имеет абстрактный getMorningAfterFeeling() метод, чтобы позволить подклассам вернуть свои специфические чувства. Это позволит упростить многие Ваши поймать блоков в этом:

} catch (AbstractRejectionException e) {
morningAfterFeeling = e.getMorningAfterFeeling();
log.error(e);
}

Также, вы изначально установка morningAfterFeeling к "великим", но проверка хорошая".равна(morningAfterFeeling. Я предполагаю, что это была опечатка.

2
ответ дан 28 октября 2011 в 07:10 Источник Поделиться

Вы и ваш старший обработка исключения NullPointerException с той же логике

if ( matingCall == null || matingCall.equals("") )

Но это дает мне ughhhhh чувство. Однако вы оба правы, но я бы изменить код

if ( matingCall == null || "".equals(matingCall) ) {
// do what you do
}

Это гарантия того, что НПЭ никогда не произойти.


Теперь playMatingGameA(строка) имеет хорошую работу-поток логики. Как вы сказали, "Если это плохо, вернуться. Все кончено. Если нет, предполагаю, что это хорошо и двигаться дальше.". Я тоже верю в это как код хорошо обрабатывать. Я всегда пожертвовать Лок по читабельности и ремонтопригодности.

Ваша явная обработка исключений упрощает отладку кода, чем playMatingGameA(строка) способ. Теперь в случае многократного в CodeBlocks поймать, вы можете легко оптимизировать, что.

Далее Java7 вы можете поймать несколько исключений в одном блоке catch. Поймать несколько исключений и т. д да?

Теперь ваш код или код старших по россыпи, как, что 8-9 строк кода. Да? Так Что Наслаждайтесь.

0
ответ дан 31 августа 2013 в 03:08 Источник Поделиться