代码重构:代码的坏味道

原文如下:

1. [代码]students.xml     

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?xml version="1.0"?>

<students>

    <student>

        <name>John</name>

        <grade>B</grade>

        <age>12</age>

    </student>

    <student>

        <name>Mary</name>

        <grade>A</grade>

        <age>11</age>

    </student>

    <student>

        <name>Simon</name>

        <grade>A</grade>

        <age>18</age>

    </student>

</students>

2. [代码]XMLParser.java     

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

package net.viralpatel.java.xmlparser;

   

import java.io.File;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

   

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

    

public class XMLParser {

    

    public void getAllUserNames(String fileName) {

        try {

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

            DocumentBuilder db = dbf.newDocumentBuilder();

            File file = new File(fileName);

            if (file.exists()) {

                Document doc = db.parse(file);

                Element docEle = doc.getDocumentElement();

    

                // Print root element of the document

                System.out.println("Root element of the document: "

                        + docEle.getNodeName());

    

                NodeList studentList = docEle.getElementsByTagName("student");

    

                // Print total student elements in document

                System.out.println("Total students: " + studentList.getLength());

 

                if (studentList != null && studentList.getLength() > 0) {

                    for (int i = 0; i < studentList.getLength(); i++) {

   

                        Node node = studentList.item(i);

    

                        if (node.getNodeType() == Node.ELEMENT_NODE) {

    

                            System.out.println("=====================");

 

                            Element e = (Element) node;

                            NodeList nodeList = e.getElementsByTagName("name");

                            System.out.println("Name: "

                                    + nodeList.item(0).getChildNodes().item(0)

                                            .getNodeValue());

   

                            nodeList = e.getElementsByTagName("grade");

                            System.out.println("Grade: "

                                    + nodeList.item(0).getChildNodes().item(0)

                                            .getNodeValue());

    

                            nodeList = e.getElementsByTagName("age");

                            System.out.println("Age: "

                                    + nodeList.item(0).getChildNodes().item(0)

                                            .getNodeValue());

                        }

                    }

                } else {

                    System.exit(1);

                }

            }

        } catch (Exception e) {

            System.out.println(e);

        }

    }

    public static void main(String[] args) {

  

        XMLParser parser = new XMLParser();

        parser.getAllUserNames("c:\\students.xml");

    }

}

类中存在的问题有:

1.类名起得不好--给人的感觉你这个解析的类,结果是个测试解析的类 
2.方法名起得不好--给人的感觉是有返回值的,结果是个没有返回值的 
3.方法内容写得太乱,把解析及数据获取啥的都放在一个方法里了。 
4.代码逻辑性不好,前面写了System.out.println("Total students: "  + studentList.getLength());后面还在写studentList != null,如果前面不出异常,这里就没有用;如果前面出异常,这里检查点根本就过不来。 
5.中间用了System.exit,显然这不是一个好的处理,人家调你个参数,你给悄无声息的把整个应用停止了。 
6.代码重复率太高 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

NodeList nodeList = e.getElementsByTagName("name");

 

                            System.out.println("Name: "

                                    + nodeList.item(0).getChildNodes().item(0)

                                            .getNodeValue());

                            nodeList = e.getElementsByTagName("grade");

                            System.out.println("Grade: "

                                    + nodeList.item(0).getChildNodes().item(0)

                                            .getNodeValue());

                            nodeList = e.getElementsByTagName("age");

                            System.out.println("Age: "

                                    + nodeList.item(0).getChildNodes().item(0)

                                            .getNodeValue());

这个太难看了。 

小结:这段代码把许多不良编程习惯都带出来了。

当然也可能是@老枪 当时只是随便写写的。

当然有人或许会问,你怎么写?换我写,我的写法是这样的,当然类名我这里只是用来测试一下,因此写个TestXmlParser ,实际上应该是两个类的:一个功能类,一个测试的类:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public class TestXmlParser {

    public static void main(String[] args) throws Throwable {

        File file = new File("E:/test/students.xml ");

        XmlStringParser parser = new XmlStringParser();

        XmlDocument document = parser.parse(IOUtils.readFromInputStream(

                new FileInputStream(file), "utf-8"));

        printStudents(document.getRoot());

    }

    private static void printStudents(XmlNode studentsNode) {

        for(XmlNode studentNode:studentsNode.getSubNodes("student")){

            printStuent(studentNode);

        }

    }

    private static void printStuent(XmlNode studentNode) {

        printSubTagByName(studentNode,"name");

        printSubTagByName(studentNode,"grade");

        printSubTagByName(studentNode,"age");

    }

    private static void printSubTagByName(XmlNode studentNode,String tagName) {

        System.out.println( studentNode.getSubNode(tagName).getContent());

    }

}

当然了,上面没有做边界检查,仅是为了说明例子而已,但是执行结果与@老枪 的是一样的。。

时间: 2024-12-01 03:07:57

代码重构:代码的坏味道的相关文章

java中什么是代码重构,什么时候需要代码重构

问题描述 java中什么是代码重构,什么时候需要代码重构 java中什么是代码重构,什么时候需要代码重构 代码重构一般发生在地方,代码重构需要注意什么问题 解决方案 当你的代码不好维护,不好升级,不好管理的时候肯定是需要重新构造.每次重构都会学到很多东西.开始写代码如果质量高,需要重构的量就少.反之就多.参考这个:http://blog.mkfree.com/posts/30 解决方案二: 重构就是在不改变软件系统外部行为的前提下,改善它的内部结构.重构代码不仅仅限于java开发中,任何开发语言

《Web前端开发最佳实践》——2.2 前端代码重构

2.2 前端代码重构 代码重构是业内经常讨论的一个热门话题.重构指的是在不改变代码外部行为的情况下进行源代码修改,重构之前需要考虑的是重构后如何才能保证外部行为不改变.对于后端代码来说,可以通过大量的自动化测试来确保重构后的代码逻辑,可对于普遍缺乏自动化测试的前端代码来说,重构之前一定要考虑再三才能下手.我曾经有一次不算太成功的前端重构经历,所幸的是没有导致太大的问题,但教训是惨痛的.此次重构的项目本身没有足够的自动化测试,尤其是针对前端的自动化测试,其实在重构之前也预想到了重构的风险.先来介绍

《重构》阅读笔记-代码的坏味道

决定何时重构.何时停止和知道如何重构一样重要! 开发者必须通过实践培养自己的经验和直觉,培养出自己的判断力:学会判断一个类内有多少个实例变量算是太大.学会判断一个函数内有多少行代码才算太长. 重复代码(Duplicated Code) 如果你在一个以上的地方看到相同的程序结构,那么可以肯定:设法将它们合而为一,程序会变得更美好!你需要决定这个重复的代码放在哪里比较合适,并确保它被安置之后就不会在别的地方再次出现. 过长函数(Long Method) 程序越长越难以理解.现代OO语言几乎完全免去了

那些有坏味道的代码

最近每天早上上班的第一件事情就是把昨天写的代码重构优化一下,以前没弄过,现在发现这个过程真是非常爽的.看着代码一点点变好,还是很不错的感觉. 最经常遇到的一些坏味道这里列一下: 嵌套太多 1 2 3 4 5 6 7 8 9 10 if (!empty($data) {     if (is_array($data)) {         foreach($data as $item) {             // Do something         }         return $

干掉你代码中的坏味道

原文出自[听云技术博客]:http://blog.tingyun.com/web/article/detail/1094 最近团队开始抓代码质量了,总结一下自己的经验,先看看坏代码有哪些特点: "都一样,不幸的家庭却各有不同",这句话放到代码里也同样适用.接下来,我们聊一聊如何解决坏代码问题.  如果我问你,"你们是如何保证团队代码质量的",你的回答可能是:"我们每次写完代码,都会花一些时间review一下."  恩,做的确实不错,但是,做的还不

解析大型.NET ERP系统 代码的坏味道

1  对用户输入做过多的约定和假设 配置文件App.config中有一个设定报表路径的配置节: <add key="ReportPath" value="C:\Users\Administrator"/> 在程序中有一个销售报表文件SalesReport.rpt,用代码调用这个报表,可能会写成: string salesReport=ReportPath + "SalesReport.rpt"; 因为路径末尾没有加反斜线,会抛出找不到

重构代码的七段历程

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 你曾去想重构一个很老的模块,但是你只看了一眼就恶心极了.奇怪的函数和类的命名,文档等等,整个模块犹如一个带着脚镣的衣衫褴褛的可怜人,虽然可以走路,但是却让人感到很不舒服.面对这种情况,作为真正的程序员绝对不会去认输的,他们会接受挑战.认真分析,哪怕重写也再所不惜.最终那个模块会被他们重构,就像以前和大家介绍过的那些令人销魂的编程方式中的屠宰式编程一样. 以下是重构代

Hi,我们的代码重构了

 作为一名程序员,我最大的愿望是自己写的代码,能够被人称赞,一直留存在项目里,直到永远.能够让自己的代码一直留存在项目里,一方面自己写的代码要健壮,没有任何逻辑错误.另一方面,还要具有很好的扩展性,能够适应需求的变化.对于前者来说,只要有个两三年的基本功,基本上就能保证代码的质量.然而,要写出具有扩展性的代码,却是一件比较困难的事情.       不是因为具有可扩展性的代码不好写,而是因为这个度不好把握.我们知道系统的可扩展性总是与系统的业务和性能成反比,因此,我们不会在追求系统的扩展性上而忽略

领导重构代码,重构一堆的bug,怎么办 ?

问题描述 领导重构代码,重构一堆的bug,怎么办 ? 本来测试通过领导重构代码,重构一堆的bug,页面都给换了?怎么办 解决方案 领导说什么就是什么,不要自作主张 解决方案二: 重构代码,有bug就修正呗.

代码重构(二):类重构规则

在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace Temp with Query, Introduce Explaining Variable, Split Temporary Variable, Remove Assignments to Parameters, Replace Method with Method Object等.关于