??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲最快最全在线视频,成人国产精品免费视频,成人蜜臀av电影http://www.aygfsteel.com/aldmd/category/19690.htmlzh-cnWed, 04 Apr 2007 02:16:29 GMTWed, 04 Apr 2007 02:16:29 GMT60所有漂亮的代码跑哪里去?http://www.aygfsteel.com/aldmd/articles/98677.html狮子?/dc:creator>狮子?/author>Thu, 08 Feb 2007 02:23:00 GMThttp://www.aygfsteel.com/aldmd/articles/98677.htmlhttp://www.aygfsteel.com/aldmd/comments/98677.htmlhttp://www.aygfsteel.com/aldmd/articles/98677.html#Feedback0http://www.aygfsteel.com/aldmd/comments/commentRss/98677.htmlhttp://www.aygfsteel.com/aldmd/services/trackbacks/98677.html
不过QHohpe质疑Q假如所有的应用开发项目都使用首回合的草案Q他如何才能发现代码中的~陷。当他发C码中存在“这是个错误”或者“需要进行核查”等注释Ӟ他很不满意。最佳的最优秀的程序员怎么能够写出q样的代码和注释?

他一边不断重复着自己的关键词Q一辚w:“所有漂亮的代码跑哪里去?”他用开玩笑的语气这栯侃Y件开?“大概是门卫在半夜进来把我们的代码搞得ؕ七八p吧。?br />
像Hohpe所见到的情况一P代码很多时候是被很一般的可以防止的原因搞q。其中的首要原因是拙劣的代码引h多拙劣的代码。他的理论是Q如果某个应用程序的最初的开发h员不自己的代码规划清晎ͼ让Q何程序员都可以理解,那么潘多拉的盒子׃(x)被打开?br />
接下来的事情从开发h员编写代码开始,即代码可以q行Q但是代码本w是很难让其他程序员理解的。接着Q在应用上马之后Q某个程序员要做一q的l护。代码变成了(jin)一堆ؕ七八p的东西?br />
所以,可能W二个做l护的程序员在修Ҏ(gu)Q会(x)对自p:“我只在q里d我的代码。它不会(x)坏到哪里ȝ。?br />
但经q上面这L(fng)几轮修改后,原先由最优秀的h~写的特性代码,l于变得来糟p?br />
他向出席ServerSide?x)议的听众提供?jin)一些避免以上事情发生的几点。他?“被写出的代码不?x)好到哪里去。要让下一个h觉得你是在花大力气编写优雅的代码。”作Z个架构师Q他首先要懂得徏模对应用E序的h(hun)倹{他_(d)qƈ不需要很复杂的徏模工P甚至在一张纸上的L型都可以有很好的效果?br />
Hohpe反复E序员应该是Zh写代码,而不是ؓ(f)机器写代码。他?“要对h们交互行行徏模。当涉及(qing)用户界面Ӟq一点尤光要。”他向非E序员展C应用程序,来观察程序员对于E序工作的理解对于潜在的最l用h否正?br />
他提醒道Q所谓的业务逻辑qL和程序员所想的一栗他?“假如业务逻辑真的和程序员想的一P那么׃?x)这么困难?jin)。这也是Z么说扑ֈ最l用L(fng)竟如何与应用E序交互非常重要的原因。?br />
他敦?j)JavaE序员利用Java的经验来~写设计好的代码Q让其他E序员觉得优雅。“ؓ(f)不是机器编写代码”是Hohpe思想的核?j)。他Q如果程序员仅仅只ؓ(f)机器写代码,那么他们׃需要JavaQ他们可以回到汇~代码的时代?img src ="http://www.aygfsteel.com/aldmd/aggbug/98677.html" width = "1" height = "1" />

]]>
[转脓(chung)]你还在用if else吗?http://www.aygfsteel.com/aldmd/articles/98676.html狮子?/dc:creator>狮子?/author>Thu, 08 Feb 2007 02:22:00 GMThttp://www.aygfsteel.com/aldmd/articles/98676.htmlhttp://www.aygfsteel.com/aldmd/comments/98676.htmlhttp://www.aygfsteel.com/aldmd/articles/98676.html#Feedback0http://www.aygfsteel.com/aldmd/comments/commentRss/98676.htmlhttp://www.aygfsteel.com/aldmd/services/trackbacks/98676.html板桥里h http://www.jdon.com 2006/1/11

  面向q程设计和面向对象设计的主要区别是:(x)是否在业务逻辑层用冗长的if else判断。如果你q在大量使用if elseQ当?dng)界面表现层除外,即你用Java/C#q样完全面向对象的语aQ也只能说明你的思维停留在传l的面向q程语言上?/p>

传统思维?fn)惯分?/strong>

  Z么会(x)业务逻辑层用if elseQ其实用者的目的也是Z(jin)重用Q但是这是面向过E编E的重用Q程序员只看C码重用,因ؓ(f)他看到if else几种情况下大部分代码都是重复的,只有个别不同Q因此用if else可以避免重复代码Qƈ且认是模板Template模式?/p>

  他范的错误是Q程序员只从代码q行序q个方向来看待它的代码,q种思维cM水管或串行电(sh)路,水沿着水管动Q代码运行次序)(j)Q当遇到几个分管Q子)(j)Q就分到q几个分子在流动,q里q当于到代码的if else处了(jin)?/p>

  而用OOQ则首先打破q个代码׃向下序{同于运行时的先后@序这个规律,代码l构不由执行循序军_Q由什么决定呢Q由O(jin)O设计Q设计模式会(x)取代q些if elseQ但是最后L׃个Service{ȝ按照q行序l装q些OO模块Q只有一处,q处可包含事务,一般就是ServiceQEJB中是Session bean?/p>

  一旦需求变化,我们更多的可能是Service中各个OO模块Q甚x只改动Service中的OO模块执行序pW合需求?/p>

  q里我们也看到OO分离的思\Q将以前q程语言的一个Main函数d分解Q将q行序与代码其他逻辑分离开来,而不是象面向q程那样混ؕ在一赗所以有人感慨,OO也是要顺序的Q这是肯定的Q关键是q行序要单独分d来?/p>

  是否有if else可以看出你有没有运行顺序分d家?/p>

设计模式的切入口

  l常有h反映Q设计模式是不错Q但是我很难用到Q其实如果你使用if else来写代码Ӟ除显C控制以外)(j)Q就是在写业务逻辑Q只不过使用单的判断语句来作为现实情늚替代者?/p>

   q是以大家熟(zhn)的论坛帖子Z子,如ForumMessage是一个模型,但是实际中帖子分两种性质Q主题脓(chung)Q第一个根_(d)(j)和回帖(回以前帖子的帖子Q,q里有一个朴素的解决Ҏ(gu)Q?br />建立一个ForumMessageQ然后在ForumMessage加入isTopicq样判断语句Q注意,你这里一个简单属性的判断引入Q可能导致你的程序其他地方到处存在if else 的判断?/p>

  如果我们改用另外一U分析实现思\Q以对象化概늜待,实际中有主题贴和回帖Q就是两U对象,但是q两U对象大部分是一致的Q因此,我将ForumMessage设ؓ(f)表达主题_(d)然后创徏一个承ForumMessage的子cForumMessageReply作ؓ(f)回帖Q这P我在E序地方Q如Service中,我已l确定这个Model是回帖了(jin)Q我q接下溯ؓ(f)ForumMessageReply卛_Q这个有点类似向Collection攑օ对象和取出时的强制类型{换。通过q个手段我消灭了(jin)以后E序中if else的判断语句出现可能?/p>

  从这里体C(jin)Q如果分析方向错误,也会(x)D误用模式?/p>

  讨论设计模式举例Q不能没有业务上下文场景的案例,否则无法军_是否该用模式Q下面D两个Ҏ(gu)的例子:(x)

  W一. q个帖子中D例的W一个代码案例是没有上下文的Q文中只说明有一D代码:(x)

main() {

ifQcase AQ{

//do with strategy A

}else(case B){

//do with strategy B

}else(case C){

//do with strategy C

}

}

 

  q段代码只是Ua(b)的代码,没有业务功能Q所以,在这U情况下Q我们就很难定使用什么模式,是一定用{略模式{,也逃不q还是用if else的命q,设计模式不是法Q不能将一D|无意义的代码变得单了(jin)Q只能将其体现的业务功能更加Ҏ(gu)可拓展了(jin)?/p>

  W二.?a target="_blank">q个帖子中,作者D?jin)一个PacketParser业务案例Q这D代码是体现业务功能的,是一个数据包的分析,作者也比较?jin)各U模式用的不同Q所以我们还是用动态代理模式或Command模式来消灭那些可能存在的if else

  ׃上两个案例表明:(x)业务逻辑是我们用设计模式的切入点,而在分解业务逻辑Ӟ我们?fn)惯则可能用if else来实玎ͼ当你有这U企图或者已l实C码了(jin)Q那么就应该考虑是否需要重构Refactoring?jin)?br />

if else替代?/strong>

  那么实战中,哪些设计模式可以替代if else呢?其实GoF设计模式都可以用来替代if elseQ我们分别描q如下:(x)

  • 状态模式 
      当数据对象存在各U可能性的状态,而且q种状态将?x)?jing)响到不同业务l果Ӟ那么我们应该考虑是否使用状态模式,当然Q用状态模式之前,你必首先有内存状态这个概念,而不是数据库概念Q因为在传统的面向过E的/面向数据库的pȝ中,你很隑֏现状态的Q从数据库中d某个|然后Ҏ(gu)q个D行代码运行分,q是很多初学者常q的事情。参考文?状态对象:(x)数据库的替代?/font>
      使用传统语言思维的情况还有:(x)使用一个类整数变量标识状态:(x)

     

    public class Order{

    private int status;

    //说明Q?

    //status=1 表示订货但ؓ(f)查看 Q?/p>

    //status=2 表示已经查看未处理;

    //status=3 表示已经处理未付?gu)?/p>

    //status=4 表示已经付款未发?/p>

    //status=5 表示已经发货

    }


      上述c设计,无疑是将cMZl语a的函数来使用Q这样导致程序代码中存在大量的if else?br />
  • {略模式 
      当你面(f)几种法或者公式选择Ӟ可以考虑{略模式Q传l过E语a情况是:(x)从数据库中读取算法数|数?表示{略1Q例如保存到数据库;数gؓ(f)2表示{略2Q例如保存到XMl文g中。这里用if else作ؓ(f){略选择的开兟?

  • command模式 
      传统q程的思维情况是:(x)如果客户端发Zh1?A"Q那么我调用A.javaq个对象来处理;如果代号??B"Q我p用B.java来处理,通过if else来判断客L(fng)发送过来的代码Q然后按事先U定的对应表Q调用相应的cL处理?br />
  • MVC模式 
      MVC模式的传l语a误用和Command模式cMQ在一个ActioncMQ用if elseq行前后台调度,如果客户端传送什么命令;我就调用后台什么结果;如果后台处理什么结构,再决定推什么页面,不过Q现在我们用Struts/JSFq样MVC模式的框架实现者就不必范这U低U错误?br />
  • 职责链模式 
      职责链模式和Command模式是可选的Q如果你实在不知道客L(fng)?x)发Z么代P也没有一个事先定义好的对照表Q那么你只能~写一个个cd运气一h开q个包看一下就可以。与Command是不同在AOP vs Decorator一文中有分析?br />
  • 代理或动态代理模式 
      代理对象可以是符合某U条件的代表者,比如Q权限检验,传统面向q程思维是:(x)当一个用L(fng)陆后Q访问某资源Ӟ使用if elseq行判断Q只有某U条件符合时Q才能允许访问,q样权限判断和业务数据逻辑混ؕ在一P使用代理模式可以清晰分离Q如果嫌不太好,使用动态代理,或者下面AOP{方式?br />
  • AOP或Decorator模式
      
      其实使用filterqo(h)器也可以替代我们业务中的if elseQ过滤器起到一U过滤和{选作用,符合本qo(h)器条件的对象拦截下来做某件事情,q就是一个过滤器的功能,多个qo(h)器组合在一起实际就是if else的组合?br />  所以,如果你实在想不出什么办法,可以使用qo(h)器,过滤器看成防火墙就比较好理解,当客L(fng)有一个请求时Q经q不同性质的防火墙Q这个防火墙是拦截端口的Q那个防火墙是安全检查拦截等{。过滤器也如同红蓝白各种光o(h)镜;U色滤镜只能通过光线中的U色拦截?jin);蓝色滤镜光U中的蓝色拦截下来,q实际上是对光线使用if elseq行分解?br />

      如图Q通过一个个条gqo(h)器我们立体地实现?jin)对信号的分,如果你用if elseQ说明你是将图中的条?/2/3/4合ƈ在一P在同一个地方实现条件判断?br />  需要深入了(jin)解过滤器的实现细节和微小区别Q请参考文章:(x)AOP vs Decorator

    OO设计的ȝ  

      q有一U伪模式Q虽然用了(jin)状态等模式Q但是在模式内部实质q是使用if else或switchq行状态切换或重要条g判断Q那么无疑说明还需要进一步努力。更重要的是Q不能以模式自居Q而且ZCZh?/p>

      真正掌握面向对象q些思想是一件困隄事情Q目前有各种属于揪着自己头发向上拔的解说Q都是误人子弟的Q所以我觉得初学者读Thinking in JavaQJava~程思想Q是没有用,它试图从语言层次来讲OO~程思想Q非常失败,作ؓ(f)语言参考书可以Q但是作为Java体现的OO思想的学?fn)资料,错了(jin)?/p>

      OO~程思想是一U方法论Q方法论如果没有应用比较Q是无法体会(x)q个Ҏ(gu)论的特点的,是古代一个方法论Q?zhn)是靠挑水砍柴这些应用才能体会(x)?/p>

      那么OO思想靠什么应用能够体?x)到了(jin)?是GoF设计模式QGoF设计模式是等于Y件h员的挑水砍柴{基本活Q所以,如果一个程序员q基本活都不?x),他何以自居OOE序员?从事OO专业设计~程q个工作Q如果不掌握设计模式基本功,p一个做和尚的h不愿意挑水砍_(d)他何以立个行业?早就被师傅赶下山?/p>

      最后ȝQ将if else用在地方还可以Q如单的数值判断;但是如果按照你的传统?fn)惯思维Q在实现业务功能时也使用if elseQ那么说明你的思维可能需要重塑,你的~程l验丰富,传统q程思维模式容易根p固,想靠自己改变很困难;接受专业头脑风暴培训?/p>

      用一句话ȝQ如果你做了(jin)不少pȝQ很久没有用if else?jin),那么说明你可能真正进入OO设计的境C(jin)。(q是本h自己发明的实战性的衡量考核标准Q?/p>

    相关资料Q?/p>

    面向对象与领域徏?

    GoF设计模式

    软g最大的q求是什么?

    数据库时代的l结



  • ]]>
    Java~程技巧:(x)列表排序http://www.aygfsteel.com/aldmd/articles/97388.html狮子?/dc:creator>狮子?/author>Thu, 01 Feb 2007 15:23:00 GMThttp://www.aygfsteel.com/aldmd/articles/97388.htmlhttp://www.aygfsteel.com/aldmd/comments/97388.htmlhttp://www.aygfsteel.com/aldmd/articles/97388.html#Feedback0http://www.aygfsteel.com/aldmd/comments/commentRss/97388.htmlhttp://www.aygfsteel.com/aldmd/services/trackbacks/97388.html [摘自QCSDN http://dev.csdn.net/article/31/31142.shtm]

    在Java Collection Framework中定义的List实现有VectorQArrayList和LinkedList。这些集合提供了(jin)对对象组的烦(ch)引访问。他们提供了(jin)元素的添加与删除支持。然而,它们q没有内|的元素排序支持.

    你能够用java.util.CollectionscM的sort()Ҏ(gu)对List元素q行排序。你既可以给Ҏ(gu)传递一个List对象Q也可以传递一个List和一个Comparator。如果列表中的元素全都是相同cd的类Qƈ且这个类实现?jin)Comparable接口Q你可以单的调用Collections.sort()。如果这个类没有实现ComparatorQ你也可以传递一个Comparator到方法sort()中,q行排序。如果你不想使用~省的分c顺序进行排序,你同样可以传递一个Comparator到方法sort()中来q行排序。如果列表中的元素ƈ不都是相同类型的c,你在q行排序的时候就不是q样q运?jin)。除非你~写一个专用的跨类的Comparator?/font>

      排序的顺序怎么样呢Q如果元素是String对象Q却省的排序序是按照字W编码进行的Q基本上是每个字W的ASCII/Unicode倹{如果严格的限制在处理英文,却省的排序顺序通常是够的Q因为它首先排A-ZQ然后是写字母a-z。然而如果你处理非英文字Q或者你只是想用不同的排序序Q这样Collections.sort()出C(jin)W二U变化。例如,你想使用字符串的反序q行排序。ؓ(f)?jin)实现这个功能,你可以在CollectionscM通过reverseOrder()来获取一个反序Comparator。然后,你将反序Comparator传递给sort()Ҏ(gu)。换句话_(d)你作如下工作Q?

    List list = ...;
    Comparator comp = Collections.reverseOrder();
    Collections.sort(list, comp);

      如果列表包含目QMan, man, Woman, 和womanQ排序好的列表将是Man, Woman, man, woman。这里没有什么复杂的。需要注意的非常重要的一Ҏ(gu)Collections.sort()是进行原位排序。如果你需要保留原序,需要先对原集合q行复制Q在排序Q就像这P(x)

    List list = ...;
    List copyOfList = new ArrayList(list);
    Collections.sort(copyOfList);

      q里Q排好序的列表是QMan, Woman, man, womanQ但是原始列表(Man, man, Woman, womanQ被保留?jin)?/font>

      到目前ؓ(f)止,排序是区分大写的。你如何q行不去分大写的排序呢Q一U实现方式是象这样实现Comparator:

    public static class CaseInsensitiveComparator
    implements Comparator {
    public int compare(Object element1,
    Object element2) {
    String lower1 =
    element1.toString().toLowerCase();
    String lower2 =
    element2.toString().toLowerCase();
    return lower1.compareTo(lower2);
    }
    }

      你确实不需要手工的创徏q个cR而是Q你可以是用以存在的ComparatorQCASE_INSENSIVTIVE_ORDERQ它是在StringcM定义的?/font>

      q种实现方式有一点小的问题。Sort()法提供E_的排序,q保持与原有序列相同的元素。这意味着一个包含两个元素”woman”和”Woman”的列表有不同的排序,而这U不同是Ҏ(gu)两个元素在列表中出现的先后次序决定的?/font>

      语言的不同又?x)怎么样呢Qjava.text包提供了(jin)Collector和CollectionKeycLq行区分语言的排序。这里是例子:

      注意Q如果你的文本是本地语言Q而不是缺省语aQ你需要传递一个本地语U给getInstance()Ҏ(gu)Q就?

    public static class CollatorComparator
    implements Comparator {
    Collator collator = Collator.getInstance();
    public int compare(Object element1,
    Object element2) {
    CollationKey key1 = collator.getCollationKey(
    element1.toString());
    CollationKey key2 = collator.getCollationKey(
    element2.toString());
    return key1.compareTo(key2);
    }
    }

      你是在对集合关键字进行排序,而不是实际的字符丌Ӏ这不仅提供固定的不区分大小写的排序Q而且它是跨语U的排序。换句话_(d)如果你对西班牙文和非西班牙文的؜合词q行排序Q词ma?ana (tomorrow)排在mantra的前面。如果你不用CollectorQma?ana排在mantra的后面?/font>

      下面q个E序对一个列表进行不同类型的排序Q缺省的、区分大写的、区分语U的Q:(x)

    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.io.*;
    import java.text.*;
    import java.util.*;
    import javax.swing.*;

    public class SortIt {

    public static class CollatorComparator
    implements Comparator {
    Collator collator = Collator.getInstance();
    public int compare(Object element1,
    Object element2) {
    CollationKey key1 = collator.getCollationKey(
    element1.toString());
    CollationKey key2 = collator.getCollationKey(
    element2.toString());
    return key1.compareTo(key2);
    }
    }

    public static class CaseInsensitiveComparator
    implements Comparator {
    public int compare(Object element1,
    Object element2) {
    String lower1 = element1.toString().
    toLowerCase();
    String lower2 = element2.toString().
    toLowerCase();
    return lower1.compareTo(lower2);
    }
    }

    public static void main(String args[]) {
    String words[] =
    {"man", "Man", "Woman", "woman",
    "Manana", "manana", "ma?ana", "Ma?ana",
    "Mantra", "mantra", "mantel", "Mantel"
    };

    // Create frame to display sortings
    JFrame frame = new JFrame("Sorting");
    frame.setDefaultCloseOperation(
    JFrame.EXIT_ON_CLOSE);
    Container contentPane = frame.getContentPane();
    JTextArea textArea = new JTextArea();
    JScrollPane pane = new JScrollPane(textArea);
    contentPane.add(pane, BorderLayout.CENTER);

    // Create buffer for output
    StringWriter buffer = new StringWriter();
    PrintWriter out = new PrintWriter(buffer);

    // Create initial list to sort
    List list = new ArrayList(Arrays.asList(words));
    out.println("Original list:");
    out.println(list);
    out.println();

    // Perform default sort
    Collections.sort(list);
    out.println("Default sorting:");
    out.println(list);
    out.println();

    // Reset list
    list = new ArrayList(Arrays.asList(words));

    // Perform case insensitive sort
    Comparator comp = new CaseInsensitiveComparator();
    Collections.sort(list, comp);
    out.println("Case insensitive sorting:");
    out.println(list);
    out.println();

    // Reset list
    list = new ArrayList(Arrays.asList(words));

    // Perform collation sort
    comp = new CollatorComparator();
    Collections.sort(list, comp);
    out.println("Collator sorting:");
    out.println(list);
    out.println();

    // Fill text area and display
    textArea.setText(buffer.toString());
    frame.pack();
    frame.show();
    }
    }

      如果你的主要问题是顺序访问,可能列表不是你的好的数据l构选择。只要你的集合没有重复,你可以在?wi)(TreeSetQ中保存你的元素Q提供或不提供ComparatorQ。这P元素L排序形式的?/font>



    ]]>
    վ֩ģ壺 | | | | | ǰ| Ӳ| ɳ| | ʯʨ| | Դ| | ۩| | ʱ| ˿| ٸ| Ļ| | բ| | | פ| ƺ| Ĭ| | ˮ| Ԫı| ƽ| | | Դ| | ƽ| ɽ| ̨| ʯ̨| | ʡ| |