October 8, 2007


К этому пример
Вот такой код пришлось написать 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();

No comments:

Post a Comment