Yuri Babich (yba) wrote,
Yuri Babich
yba


К этому пример
Вот такой код пришлось написать 5 минут назад:


        for(Pair<String,String>    pair:    transformers)
        {
                FileReader    reader;
            try
            {
                reader    =    new    FileReader(pair.getSecond());
            }
            catch(java.io.FileNotFoundException    err)
            {
                continue;
            }
           
                StreamSource    source    =    new    StreamSource(reader);
                Transformer    transformer;
               
            try
            {
                transformer    =    t_factory.newTransformer(source);
            }
            catch    (javax.xml.transform.TransformerConfigurationException    err)
            {
                continue;
            }
               
            factory_.setMM4ToMM7Transformer(pair.getFirst(),transformer);
        };


Как это должно было бы выглядеть с моей точки зрения:


        for(Pair<String,String>    pair:    transformers)
        {
                FileReader    reader    =    new    FileReader(pair.getSecond());
             if   (!reader.isOpen())
                continue;

                StreamSource    source    =    new    StreamSource(reader);
                Transformer    transformer    =    t_factory.newTransformer(source);

             if   (transformer    ==    null)
                continue;
              
            factory_.setMM4ToMM7Transformer(pair.getFirst(),transformer);
        };


Теперь внимание вопрос - какой вариант читабельнее и проще в написании? :)

UPD
Я сделал ошибку, разместив не весь код, а выжимку. Вот полный вариант:


        for(Pair<String,String>    pair:    transformers)
        {
                FileReader    reader;
            try
            {
                reader    =    new    FileReader(pair.getSecond());
            }
            catch(java.io.FileNotFoundException    err)
            {
                logger_.warn(err);
                continue;
            }
           
                StreamSource    source    =    new    StreamSource(reader);
                Transformer    transformer;
               
            try
            {
                transformer    =    t_factory.newTransformer(source);
            }
            catch    (javax.xml.transform.TransformerConfigurationException    err)
            {
                logger_.warn(err);
                continue;
            }
            finally
            {
                try
                {
                    reader.close();
                }
                catch    (java.io.IOException    err)
                {
                    logger_.warn(err);
                }
                reader    =    null;
            }
               
            factory_.setMM4ToMM7Transformer(pair.getFirst(),transformer);
        }

Вариант с общим try-catch блоком мне кажется недостаточно кошерным, потому как:
- закрытие обьектов в finally становится зависимым и требует проверки открытия
- при чтении кода нужно делать дополнительный анализ "а какая операция выбрасывает это exception и что если таких операций несколько?"
- последующее возможное редактирование, ИМХО, хуже
(Например если добавить открытие еще одного файлового потока. то все сразу становится совсем плохо)

        for(Pair<String,String>    pair:    transformers)
        {
                    FileReader    reader    =    null;

            try
            {
                reader    =    new    FileReader(pair.getSecond());
   
                    StreamSource    source    =    new    StreamSource(reader);
                    Transformer    transformer    =    t_factory.newTransformer(source);;
               
                factory_.setMM4ToMM7Transformer(pair.getFirst(),transformer);
            }
            catch(java.io.FileNotFoundException    err)
            {
                logger_.warn(err);
                continue;
            }
            catch    (javax.xml.transform.TransformerConfigurationException    err)
            {
                logger_.warn(err);
                continue;
            }
            finally
            {
                if    (reader    !=    null)
                {
                    try
                    {
                        reader.close();
                    }
                    catch    (java.io.IOException    err)
                    {
                        logger_.warn(err);
                    }
                    reader    =    null;
                };
            }
        }

Соответсвенно нужно добавить одну строку в код без исключений:
reader.close();

Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments