敏捷开发Java程序常用的工具箱


准备篇

1。白板(白板笔)。
1)需求阶段和客户讨论问题时分析、设计、客户在这里自由交流大家对问题的看法
2)在项目分析和设计阶段用来进行头脑风暴,是设计的最重要的工具。白板上画的可以是UML图,但也可以是项目团队能够理解的任意图形,或者就是简单的线条、图形都可以
3)无处不在的讨论,任何时候对需求的理解和对设计的讨论都在白板上进行

一般公司里面经常会出现白板笔太久没用水用光的时候,所以我一般都要提醒后勤人员买好充足的笔,用完笔以后要盖好盖子。

2卡片(和图钉)
1) CRC是除了白板以外第二重要的设计工具,这种卡片在中国很难买到,所以一般用文摘卡代替,CRC的重要作用在于可以进行角色扮演,验证设计的准确性。CRC的前面分别写责任和协作,背面可以进行备注
2) 用户故事卡,我回去定制一个泥印,直接盖在空白的用户故事卡上,这个卡片在需求阶段可以任意传递、撕毁、重写、合、分裂,卡上有故事卡编号、优先级、风险评估和当前的迭代序号,用户故事卡订在一个大家都能看到的离开发位置较远的墙壁上
3) 任务卡,任务卡从故事卡分裂而来,用图钉钉在开发员的电脑旁边
4) 编码卡,主要纪录需要实现的测试,需要注意的事项,等等,开发人员不断增加条目、划去条目,是对一个人物而言的备忘录和todolist

3.大坐标纸(长的直尺、各种颜色的笔)

我通常会在项目的进行过程中记录各种度量,这包括有效代码增长率、测试代码增长率、功能测试通过率、故事卡完成率、测试覆盖率(具体工具在后面介绍),悬挂在比较高的位置,大家一眼能够看到的地方

另外每个迭代的每个理想天都会检查每个人任务完成的情况,延迟、提前、原因、重新估计时间、剩余实践,根据不同情况用不同的颜色表达,画在一张大白纸上,不够的话可以慢慢接长,贴在显而易见的墙壁上

4、小桌子(香烟、绿茶、咖啡或水果)
工作一段时间,2个小时左右,开发人员可以三两成群地在小桌子(或者是吸烟区)旁边抽烟、喝茶、咖啡或者水果,交流相互的心得、讲讲笑话、谈谈碰到的问题。很多问题就在这里面谈出来、解决、得到线索等等,团队的气氛经常就是在这个时候变得慢慢融洽。

第2个卡片我想是否可以用便笺本,那种随处可以买到黄色便笺,写下内容,随意可以贴到办公桌前,墙壁上。

卡片一定要硬的,方便传递,有质地感,有一定的厚度

1。在CRC的扮演过程中,举起一张硬卡片和一张软软的纸感觉不同
2。在撕卡片的时候,要有声音有感觉,表示我们对需求的更改是非常欢迎的,不是说些下来的东西就完全算数了
3。在需求过程中,卡片需要在客户、程序员、分析人员之间传递,纸片太软
4。客户需要根据价值把卡片按优先级分堆,决定我们的迭代和发布,纸片不方便,容易遗漏和混淆,不太正式
5。故事卡可能一部分可能移到下一个迭代,不能在墙上贴了一段时间就变得破破烂烂

对于第3部分而言,这又是一个交流问题,重在交流和整体感觉,而不是具体的数据

客户、老板、项目开发人员、管理人员各位都希望知道现在进行的情况,开发人员也需要对项目中其他人员地进行情况有所了解,所以最好把这些东西放在最显而易见的地方。每个相关人员都可以一眼感觉到项目的“温度“

一般来说,我检查和度量的时间是在一个理想天,也就是3-4天的时间,一般采用的工具是JavaNCSS ,我有编写一个小小的工具,利用Javancss计算出源代码的统计信息,按照时间为横轴,画出增长的曲线,然后手工画到墙上的大纸上。一些例子

1。产品代码增长率,这个增长率应该在项目前期比较高,且比较稳定,如果某段时间的增长率出现异常情况,可能在设计或实现过程中碰到了某些问题。在项目后期应该逐渐降低(但不意味着故事完成增长率的下降,相反体现在故事增长率和测试增长率的相对提高),这是我们对重用的一个期望。代码增长率也是项目管理人员比较关心的问题。

2。单元测试代码增长率,一直保持在比较稳定的增长率,不同阶段和产品代码的增长之间保持一个相对比率,例如从1:1到1.5:1到2:1,

3。代码覆盖率,用clover可以很方便地生成,CLover的历史信息和增长信息特别有用,当然还需要手工摘录最重要的几条曲线

4。用户故事完成率,这是客户需关心的东东,只有所有的用户故事完成,才能号称迭代正确完成,不然写了多少代码读是没有意义的

5。功能测试增长率和Bug密度,功能测试反应的未通过的bug,这个最好是分界面、WEb曾或者数据库层、模型层,统计在不同模块的密度,这个Bug率最好加上估计的时间,例如1小时、2小时,半天等等。功能测试没有100%通过是正常的,但是必须纪录BUg的相对密度。

至于开发人员的进度模板,这个就比较复杂了,不同的项目也有所调整,我曾经用XPPlanner产生过报表,但太灵水了,所以不得已用excel画的,每1理想天更新一次,这是很重要的一个掌控工具,一个迭代周期内必须尽早估计到可能需要的延迟、客户需求变化的调整、一些人提早或落后需要开发人员之间相互调剂等等,据说2003年生产力奖的XPOne非常好,但没有评估版本,我每次只能用手工做。

这个象20个人的团队大约要花上3-4个小时左右,所有人都要参加,要充分交流分析体现或落后的原因、要及时调整后面的估计,同时尽量让每个人发表自己的意见,例如可能需要交换任务,重新调整任务的时间、加入新的任务、把某些任务延迟到后一个迭代、解决本天内的一些新发现的公共问题等等。

当然,最后还是要抄到墙上去

在XP和其他敏捷软件开发团队里面,交流和反馈不是一个空洞的概念,所有的工具(例如SCM)、纪律、度量、工作方式、环境都有为这个目的服务,交流的畅通是需要花费大量的时间、精力和很多习惯才能慢慢形成的,不是轻而易举就能达到的。这是一个无论怎么强调都不为过的重点。

Wiki
我是Snipsnap的老用户,所以项目开发的时候还是用SnipSnap,SnipSnap的好处是使用简单,配置方便,涉及到项目开发的具体应用,通用词汇表的建立、概念的交流、工作方式的讨论我喜欢在Wiki上进行,Wiki也是一个项目知识库实现的最佳方式,包括项目所需要的配置说明、项目用到的书籍、文章和相关的讨论

第二个Wiki是Fitness,这是做功能测试最好的工具之一

关于Wiki,我自己有项目管理中的新想法,不过很多相关的产品都不是开源的,太贵,所以目前还没有应用起来,等我自己了,呵呵

IssuerTracker
Jira,这是我少数选用的商业产品,举我自己的感觉,这是Issuer里面No.1的产品,可惜和XP的项目计划偏差较大,对于时间估计和流程配合不够流畅。

为什么用Wiki的原因,我在另一个帖子已经有些说明,主要的问题是WIKI的形式比较自由,能够充分发挥想象力,不需要非常正式,但是又容易在开发的过程中积累起很有意义的思考、文档和模式。总而言之,是非常利于不拘形式的自由的交流。
Wiki的简单和目前很多WIKI的可扩展性,使得我们能够把Wiki和其他软件,例如Issuer,CVS等方便地结合起来。

Wiki软件和Eclipse的结合可以产生很多对项目开发有益的想法和帮助,虽然这一块目前还不时有很多公司在做,但我觉得一些小小的结合就能产生很好的交流效果和文档组织。

使用Jira的原因是它是面向开发人员的一个tracker工具,在开发阶段它的表现要胜于其他跟踪系统,它的灵活性和新近的插件机制也能够方便我更好的扩展何时佩。

JUnit,这个没什么好说的,当然用法上自然是最偏向于KentBeck的用法。用Cactus测试感觉不是很方便。由于struts已经不用了,用JUnit就能够测试Webwork的Action,所以Web层我基本上已经不测了。

Clover,虽然TDD的覆盖率肯定是非常高的,但很多项目不做TDD的,我自己有一个小小的工具,自己用用还可以,但项目中没办法用, JCoverage是开源的,红工厂也有产品,但是我没用过

用户测试,目前我在第二个小项目中用Fit和Fitnesse,但没有在大项目使用的经验。以前是自己写excel到数据库转换,用JUnit测的,比较麻烦

阅读全文...

你的业务逻辑提供框架(翻译)


大部分 web 以及企业级 Java 应用可被分成三部分:与用户交互的前台,与数据库这样的后台系统交互的服务层,以及它们之间的业务逻辑。最近这段时间,通常我们会使用框架来实现前台和后台的需求(例如:Struts, Cocoon, Spring, Hibernate, JDO, 以及实体 Beans),但是却没有一种标准手段很好的组织业务逻辑。像 EJB 和 Spring 这样的框架都以 high level 方式处理,这无助于组织我们的代码。除非我们改变这种凌乱,否则系统将不会健壮,框架中杂乱的 if...then 语句能带给我们可配置性、可读性的优点,以及在其他地方复用代码的愉悦吗?本文将介绍如何使用 Drools 规则引擎框架来解决这些问题。
   
    下列的范例代码展示了我们正要试图努力避免的问题。展示了包含一些业务逻辑的 Java 典型应用。

if ((user.isMemberOf(AdministratorGroup)
      
&& user.isMemberOf(teleworkerGroup))
     
|| user.isSuperUser(){
         
         
// more checks for specific cases
         if((expenseRequest.code().equals("B203")
           
||(expenseRequest.code().equals("A903")
                        
&&(totalExpenses<200)
                
&&(bossSignOff> totalExpenses))
           
&&(deptBudget.notExceeded)) {
               
//issue payments
           } else if {
               
//check lots of other conditions
           }
else {
     
// even more business logic
}

    我们经常写出类似的(甚至更复杂)业务逻辑。当这些用 Java 实现的业务逻辑成为标准方式时,将存在下列问题:
   
        业务用户怎样在这些难以理解的代码基础上添加另一个条件(比如"C987")?一旦最初开发这些程序的员工离开了,你想成为维护这些代码的人吗?
        我们怎样检查规则的正确性?对业务伙伴的技术人员来说都够复杂的了,更不要说检查。我们可以有系统的测试这些业务逻辑吗?
        很用应用都有相似的业务规则--当其中的一个规则改变,我们能保证这一改变可贯穿整个系统?当新应用使用这些规则,该应用已经部分添加了新的规则,但不完全,我们要把逻辑重写过吗?
        我们经常需要对每个细小调整所带来的改变进行重编译/重部署,而不是坚实的依靠 Java 代码,业务逻辑是否易于配置?
        可否复用已存在的用其他(脚本)语言编写的业务规则逻辑?
       
    J2EE/EJB 以及“IoC inversion of control”框架(比如 Spring,Pico,以及 Avalon)给我们带来的是 high level 代码组织能力。在提供良好复用性、可配置性、以及安全性的同时,没有一个能替代(解决)以上的“spaghetti 代码”范例出现的问题。理想地,无论选择何种框架,不仅仅适合 J2EE 应用,而且也可用于“normal”Java(J2SE)程序,以及大部分普遍采用的表现层以及持久层框架。这种理想框架应该允许我们这样做:
   
        业务用户应该可以方便的阅读和校验业务逻辑。
        业务规则应该可被复用,并可以通过程序进行配置。
        这种框架应该是可升级的,并在高负载情况下运行。
        Java 程序员可以像使用现有的前台(Struts,Spring)和后台(ORM object-relational mapping)框架一样方便地使用这个框架。
       
    另外的问题是,有许多的 web 页面、数据库访问组织方式,业务逻辑在这两种应用中应趋于不同。而框架应该能应付这些并促进代码复用。理想的框架将能“frameworks all the way down.”,通过这种方式使用框架,我们能在应用中大量的“out of the box”,这样我们只为客户记录添加值的部分。
   
规则引擎前来救援

    我们怎样解决问题呢?一种方案是通过规则引擎获取 traction。规则引擎是为组织业务逻辑应运而生的框架,它让开发者专注于做被认为正确的事情上,而不是以 low-level 方式作出决定。
   
    通常,业务用户舒适的表达他们知道的正确的事,而不是 if...else 格式的表达方式。你也许能从业务专家听见这些东西:
   
    “FORM 10A 用来索取额外 200 欧元费用。(FORM 10A is used for expense claims over 200 Euro.)”
    “我们只进行数量在 10,000 以上的贸易。”
    “购买大于 €10m 的要经过公司董事批准。”
   
    通过专注于我们认为正确的事情上,而不是只知道怎样用 Java 代码表达,那么上面的叙述将比之前的代码范例更清晰。我们仍然需要一种机制为我们知道和做决定的事实应用这些规则。这种机制就是规则引擎。
   
Java 中的规则引擎
   
    JSR 94,如同 JBDC 允许我们与多种数据库交互一样,javax.rules 是一组与规则引擎交互的通用标准 API。为什么 JSR-94 没有详细说明实际的规则怎样书写,有下面大量的 Java 规则引擎可供选择:
   
    Jess 或许是最成熟的 Java 规则引擎,有良好的工具支持(包括 Eclipse 插件)以及文档。但是,它是商业软件,而且用 Prolog-style 符号书写规则,对 Java 程序员来说是很晦涩的。
    Jena 是一套开源框架,最初由惠普发起。虽然它有规则引擎以及在 Web 语义方面特别强大,但它并不与 JSR-94 兼容。
    Drools 是与 JSR-94 兼容的规则引擎,并且在 Apache-style 许可下完全开源。它不仅用熟悉的 Java 和 XML 语法表述规则,而且它还有强大的用户、开发者社区。在本文中有范例,我们将使用 Drools,因为它有最容易使用的类似 Java 的语法以及完全开发许可。
   
利用 Drools 开始 Java 开发

    假设有这样的场景:在阅读本文的数分钟后,你老板要求你做一个股票交易应用原型。这时,业务用户尚未被完全定义业务逻辑,你马上会想到最好的办法是用规则引擎实现。最终系统将可通过内部网访问,而且还要和后台数据库以及消息系统通讯。在着手行动前,先下载 Drools 框架(与支持库一起)。在你喜欢的 IDE 中创建新项目,确定所有 .jar 文件被引用进项目,如图 1 中所示。截图是基于 Eclipse 的,不过在其他 IDE 中创建也是相似的。

      Libraries needed to Run Drools
                   图 1. 运行 Drools 所需要的库
   
    如果我们的股票交易系统很混乱,将失去大量潜在客户(商机),所以在系统的整个步骤中放入一些模拟器(simulator)是至关重要的。这种模拟器给了你决心采用该系统的信心,甚至规则改变以后所带来的麻烦。我们将借助敏捷工具箱中的工具,以及 JUnit(http://www.junit.org/) 框架进行模拟。
   
    如下,我们写的第一段代码是 JUnit 测试/模拟器。即使我们无法测试每个对应用有价值的输入组合,但有测试也比没有测试的好。在这个范例中,所有的文件和类(包括单元测试)都放入一个文件夹/包中,但实际上,你可能会用一种适当的包、文件夹结构。范例代码中我们用 Log4j 代替 System.out 调用。

import junit.framework.TestCase;
/*
 * JUnit test for the business rules in the 
 * application.
 * 
 * This also acts a 'simulator' for the business 
 * rules - allowing us to specify the inputs,
 * examine the outputs and see if they match our 
 * expectations before letting the code loose in  
 * the real world.
 
*/
public class BusinessRuleTest extends TestCase {
  
/**
  * Tests the purchase of a stock
  
*/
  
public void testStockBuy() throws Exception{
                
    
//Create a Stock with simulated values
    StockOffer testOffer = new StockOffer();
    testOffer.setStockName(
"MEGACORP");
    testOffer.setStockPrice(
22);
    testOffer.setStockQuantity(
1000);
                
    
//Run the rules on it
    BusinessLayer.evaluateStockPurchase(testOffer);
                
    
//Is it what we expected?
    assertTrue(
      testOffer.getRecommendPurchase()
!=null);
    
    assertTrue(
"YES".equals(
      testOffer.getRecommendPurchase()));               
   }
}

    这是最基本的 JUnt 测试,我们知道我们的系统应该买所有低于 100 欧元的股票。很明显,要是没有数据持有类(StockOffer.java)和业务层类(BusinessLayer.java)它将无法编译。这两个类如下。

/**
 * Facade for the Business Logic in our example.
 * 
 * In this simple example, all our business logic
 * is contained in this class but in reality it 
 * would delegate to other classes as required.
*/
public class BusinessLayer {
  
/**
   * Evaluate whether or not it is a good idea
   * to purchase this stock.
   * 
@param stockToBuy
   * 
@return true if the recommendation is to buy 
   *   the stock, false if otherwise
   
*/
  
public static void evaluateStockPurchase
    (StockOffer stockToBuy){
                
return false;
  }
}

    StockOffer 是这样:

/**
 * Simple JavaBean to hold StockOffer values.
 * A 'Stock offer' is an offer (from somebody else)
 * to sell us a Stock (or Company share).
 
*/
public class StockOffer {
        
  
//constants
  public final static String YES="YES";
  
public final static String NO="NO";
        
  
//Internal Variables
  private String stockName =null;
  
private int stockPrice=0;
  
private int stockQuantity=0;
  
private String recommendPurchase = null;
        
  
/**
   * 
@return Returns the stockName.
   
*/
  
public String getStockName() {
        
return stockName;
  }
  
/**
   * 
@param stockName The stockName to set.
   
*/
  
public void setStockName(String stockName) {
        
this.stockName = stockName;
  }
  
/**
   * 
@return Returns the stockPrice.
   
*/
  
public int getStockPrice() {
        
return stockPrice;
  }
  
/**
   * 
@param stockPrice The stockPrice to set.
   
*/
  
public void setStockPrice(int stockPrice) {
        
this.stockPrice = stockPrice;
  }
  
/**
   * 
@return Returns the stockQuantity.
   
*/
  
public int getStockQuantity() {
        
return stockQuantity;
  }
  
/**
   * 
@param stockQuantity to set.
   
*/
  
public void setStockQuantity(int stockQuantity){
        
this.stockQuantity = stockQuantity;
  }
  
/**
   * 
@return Returns the recommendPurchase.
   
*/
  
public String getRecommendPurchase() {
        
return recommendPurchase;
  }
}

    通过 IDE 的 JUnit 插件运行 BusinessRuleTest。如果你不熟悉 JUnit,可在 JUnit 网站找到更多信息。不必惊讶,如图 2 所示第二个断言测试失败,这是因为还没把业务逻辑放在适当的地方。测试结果用高亮显示了模拟器/单元测试所出现的问题,这是很保险的。

  JUnit Test Results
              图 2. JUnit 测试结果
             
用规则编写业务逻辑
   
    在这里,我们要写一些业务逻辑,来表达“一旦股票价格低于 100 欧元,就马上购买。” 要达到这个目的,需调整 BusinessLayer.java:

import java.io.IOException;
import org.drools.DroolsException;
import org.drools.RuleBase;
import org.drools.WorkingMemory;
import org.drools.event.DebugWorkingMemoryEventListener;
import org.drools.io.RuleBaseLoader;
import org.xml.sax.SAXException;
/**
 * Facade for the Business Logic in our example.
 * 
 * In this simple example, all our business logic
 * is contained in this class but in reality it 
 * would delegate to other classes as required.
 * 
@author default
 
*/
public class BusinessLayer {
  
//Name of the file containing the rules
  private static final String BUSINESS_RULE_FILE=
                              
"BusinessRules.drl";
        
  
//Internal handle to rule base
  private static RuleBase businessRules = null;
  
/**
   * Load the business rules if we have not 
   * already done so.
   * 
@throws Exception - normally we try to 
   *          recover from these
   
*/
  
private static void loadRules()
                       
throws Exception{
    
if (businessRules==null){
      businessRules 
= RuleBaseLoader.loadFromUrl(
          BusinessLayer.
class.getResource(
          BUSINESS_RULE_FILE ) );
    }
  }     
        
  
/**
   * Evaluate whether or not to purchase stock.
   * 
@param stockToBuy
   * 
@return true if the recommendation is to buy
   * 
@throws Exception
   
*/
  
public static void evaluateStockPurchase
       (StockOffer stockToBuy) 
throws Exception{
                
    
//Ensure that the business rules are loaded
    loadRules();
    
//Some logging of what is going on
    System.out.println( "FIRE RULES" );
    System.out.println( 
"----------" );
        
    
//Clear any state from previous runs 
    WorkingMemory workingMemory 
            
= businessRules.newWorkingMemory();
    
//Small ruleset, OK to add a debug listener 
    workingMemory.addEventListener(
      
new DebugWorkingMemoryEventListener());
        
    
//Let the rule engine know about the facts
    workingMemory.assertObject(stockToBuy);
        
    
//Let the rule engine do its stuff!!
    workingMemory.fireAllRules();
  }
}

    这个类有些重要方法:
   
    loadRules(),从 BusinessRules.drl 文件加载规则。
    更新后的 evaluateStockPurchase(),用于评估业务规则。这个方法的注解如下:
        可以反复复用相同的 RuleSet(内存中的业务规则是无状态的)。
        为每次评估构造新的 WorkingMemory,因为我们的知识知道这个时刻是正确的。使用 assertObject() 放置已知事实(作为 Java 对象)到内存中。
        Drools 有个事件监听模式,允许我们“查看”事件模型中到底发生了什么。在这里我们用它打印 debug 信息。
        working memory 类中的 fireAllRules() 方法评估和更新规则(在本例中是股票出价)。
   
    再次运行该范例前,需要创建我们的 BusinessRules.drl 文件:

<?xml version="1.0"?>
<rule-set name="BusinessRulesSample"
  xmlns
="http://drools.org/rules"
  xmlns:java
="http://drools.org/semantics/java"
  xmlns:xs
    
="http://www.w3.org/2001/XMLSchema-instance"
  xs:schemaLocation
    
="http://drools.org/rules rules.xsd
  http://drools.org/semantics/java java.xsd"
>
  
<!-- Import the Java Objects that we refer 
                          to in our rules 
-->        
  
<java:import>
    java.lang.Object
  
</java:import>
  
<java:import>
    java.lang.String
  
</java:import>
  
<java:import>
    net.firstpartners.rp.StockOffer
  
</java:import>
  
<!-- A Java (Utility) function we reference 
    in our rules
-->  
  
<java:functions>
    public void printStock(
      net.firstpartners.rp.StockOffer stock)
        {
        System.out.println("Name:"
          +stock.getStockName()
          +" Price: "+stock.getStockPrice()     
          +" BUY:"
          +stock.getRecommendPurchase());
        }
  
</java:functions>
<rule-set>
  
<!-- Ensure stock price is not too high-->      
  
<rule name="Stock Price Low Enough">
    
<!-- Params to pass to business rule -->
    
<parameter identifier="stockOffer">
      
<class>StockOffer</class>
    
</parameter>
    
<!-- Conditions or 'Left Hand Side' 
        (LHS) that must be met for 
         business rule to fire 
-->
    
<!-- note markup -->
    
<java:condition>
      stockOffer.getRecommendPurchase() == null
    
</java:condition>
    
<java:condition>
      stockOffer.getStockPrice() 
< 100
    
</java:condition>
    
<!-- What happens when the business 
                      rule is activated 
-->
    
<java:consequence>
        stockOffer.setRecommendPurchase(
                              StockOffer.YES);  
          printStock(stockOffer);
    
</java:consequence>
  
</rule>
</rule-set>

    该规则文件有些有趣部分:
   
        只有在 XML-Schema 定义 Java 对象之后,我们才能引用进规则。这些对象可以是来自于任何必须的 Java 类库。
        接下来是 functions,它们可以与标准 Java 代码进行混合。既然这样,我们干脆混入些日志功能来帮助我们观察发生了什么。
        再下来是我们的 rule set,rule set 由一到多个规则组成。
        每个规则可持有参数(StockOffer 类),并需要实现一个或多个条件,当条件符合时,将会执行相应结果。
       
    在修改和编译完代码后,再次运行 JUnit 测试。这次调用了业务规则,我们的逻辑进行正确地评估,并且测试通过,参看图 3。恭喜--你已经构建了第一个基于规则的应用!

    Successful JUnit Test
    图 3.成功的 JUnit 测试
   
使规则更聪明

    刚刚构建好应用,你就向业务用户示范上面的原型,他们却忽然想起先前并没有提出的规则。其中一个新规则是当数量是负数时(<0)不能进行股票交易。“没关系,”你说,接着回到办公桌上,紧扣已有知识,快速演化你的系统。
   
    首先要更新模拟器,把以下代码添加到 BusinessRuleTest.java:

  /**
   * Tests the purchase of a stock 
   * makes sure the system will not accept 
   * negative numbers.
   
*/
  
public void testNegativeStockBuy() 
                                
throws Exception{
                
    
//Create a Stock with our simulated values
      StockOffer testOffer = new StockOffer();
        testOffer.setStockName(
"MEGACORP");
        testOffer.setStockPrice(
-22);
        testOffer.setStockQuantity(
1000);
                
        
//Run the rules on it
        BusinessLayer
              .evaluateStockPurchase(testOffer);
                
        
//Is it what we expected?
        assertTrue("NO".equals(
          testOffer.getRecommendPurchase()));
}

    这个测试是为业务用户描述的新规则建立的。正如意料之中的,如果运行 JUnit 测试,我们的新测试将失败。所以,我们要添加新的规则到 .drl 文件:

<!-- Ensure that negative prices 
                            are not accepted
-->      
  
<rule name="Stock Price Not Negative">
    
<!-- Parameters we can pass into 
                          the business rule 
-->
    
<parameter identifier="stockOffer">
      
<class>StockOffer</class>
    
</parameter>
    
<!-- Conditions or 'Left Hand Side' (LHS) 
       that must be met for rule to fire 
-->
    
<java:condition>
      stockOffer.getStockPrice() 
< 0
    
</java:condition>
    
<!-- What happens when the business rule 
                              is activated 
-->
    
<java:consequence>
      stockOffer.setRecommendPurchase(
                                  StockOffer.NO);       
      printStock(stockOffer);
    
</java:consequence>
  
</rule>

    这个规则的格式和前面的相似,除了 (用于测试负数)以及 用于设置推荐购买为 No 以外。我们再次运行测试,这次通过了。
   
    这时,如果你习惯于过程化编程(像大多数 Java 程序员一样),你也许要搔头皮了:在一个文件中包含两个独立的业务规则,而且我们也没告诉规则引擎哪个更重要。不管怎样,股票价格(对于 -22)都满足两个规则(也就是少于 0 和少于 100)。尽管这样,我们仍能得到正确结果,即使交换规则顺序。这是怎么做到的呢?
   
    下面的控制台输出有助于我们了解到底怎么回事。我们看见两个规则都执行了([activationfired] 这行),Recommend Buy 第一次被设置为 Yes 接着又被设置成 No。Drools 怎么知道执行这些规则的正确顺序呢?如果你观察 Stock Price Low Enough 规则,将发现 recommendPurchase() 其中一个条件为空。通过这点,Drools 规则引擎足以判断 Stock Price Low Enough 规则应该在 Stock Price Not Negative 规则之前执行。这个过程称为 conflict resolution。

FIRE RULES
----------
[ConditionTested: rule=Stock Price Not Negative;
  condition=[Condition: stockOffer.getStockPrice()
  < 0]; passed=true; tuple={[]}]
[ActivationCreated: rule=Stock Price Not Negative;
  tuple={[]}]
[ObjectAsserted: handle=[fid:2];
  
object=net.firstpartners.rp.StockOffer@16546ef]
[ActivationFired: rule=Stock Price Low Enough;
   tuple={[]}]
[ActivationFired: rule=Stock Price Not Negative;
   tuple={[]}]
Name:MEGACORP Price: -22 BUY:YES
Name:MEGACORP Price: -22 BUY:NO


    如果你是一名过程化程序员,无论你用怎样聪明的方式考虑这些,你都不会完全相信。这就是为什么要进行单元/模拟器测试的原因:进行 "坚固的" JUnit 测试(使用一般 Java 代码)确保规则引擎所作出的决定是按照我们所想要的路线进行。(不会花费大量金钱在无价值的股票上)同时,规则引擎的强大和伸缩性允许我们快速开发业务逻辑。
   
    稍后,我们将学习如何用更加精练的解决方案进行冲突处理。
   
冲突结局方案

    现在业务伙伴被打动了,并且开始考虑进行选择了。随即他们遇到了个 XYZ 公司股票的问题,那么我们来实现新规则吧:只有 XYZ 公司股票低于 10 欧元才可购买。
   
    像以前一样,添加测试到模拟器,接着在规则文件中包含新业务规则。首先在 BusinessRuleTest.java 中添加新方法:

 /**
 * Makes sure the system will buy stocks 
 * of XYZ corp only if it really cheap
 
*/
public void testXYZStockBuy() throws Exception{
        
  
//Create a Stock with our simulated values
  StockOffer testOfferLow = new StockOffer();
  StockOffer testOfferHigh 
= new StockOffer();
                
  testOfferLow.setStockName(
"XYZ");
  testOfferLow.setStockPrice(
9);
  testOfferLow.setStockQuantity(
1000);
                
  testOfferHigh.setStockName(
"XYZ");
  testOfferHigh.setStockPrice(
11);
  testOfferHigh.setStockQuantity(
1000);
                
  
//Run the rules on it and test
  BusinessLayer.evaluateStockPurchase(
    testOfferLow);
  assertTrue(
"YES".equals(
    testOfferLow.getRecommendPurchase()));
                
  BusinessLayer.evaluateStockPurchase(
    testOfferHigh);
  assertTrue(
"NO".equals(
    testOfferHigh.getRecommendPurchase()));             
}

    接下来向 BusinessRules.drl 中添加新

  <rule name="XYZCorp" salience="-1">
   
<!-- Parameters we pass to rule -->
   
<parameter identifier="stockOffer">
     
<class>StockOffer</class>
   
</parameter>
    
   
<java:condition>
     stockOffer.getStockName().equals("XYZ")
   
</java:condition> 
   
<java:condition>
     stockOffer.getRecommendPurchase() == null
   
</java:condition>
   
<java:condition>
     stockOffer.getStockPrice() > 10
   
</java:condition>
        
   
<!-- What happens when the business 
                                rule is activated 
-->
   
<java:consequence> 
     stockOffer.setRecommendPurchase(
       StockOffer.NO);  
     printStock(stockOffer);
   
</java:consequence>
  
</rule>

    注意业务规则文件,在 rule name 后面,我们把 salience 设置成 -1(到目前为止了解的最低优先级)。大多数规则在系统中是冲突的,这意味着 Drools 必须为规则的执行顺序做判断,假设这些条件都与规则匹配。默认的判断方式是:
       
    Salience:赋予的值。
    Recency:使用规则的次数。
    Complexity:首先执行有复杂值的特定规则。
    LoadOrder:规则载入的顺序。
   
    如果没有显示的在规则中详细指明,将会发生:
   
    XYZ 公司规则("当价格高于 10 欧元就不购买 XYZ 的股票")将先执行(Recommend Buy 标志被设置为 No)。
    接着更多的一般规则("购买所有 100 欧元以下的股票")被执行,把 Recommend Buy 标志设置为 yes。
   
    这会给我们一个不想要的结果。然而,一旦在范例中设置了 saliency 要素,最终的测试和业务规则将像预期的那样顺利运行。
   
    大多数时间,编写清晰的规则和设置 saliency 将给 Drools 足够信息以选择合适的顺序执行规则,有时我们想改变整个规则冲突处理方式。下面的例子说明了如何改变,告诉规则引擎首先执行最简单的规则。要注意的是:改变冲突解决方案要小心,它可能从根本上改变规则引擎的行为。

  //Generate our list of conflict resolvers
  ConflictResolver[] conflictResolvers = 
    
new ConflictResolver[] {
      SalienceConflictResolver.getInstance(),
      RecencyConflictResolver.getInstance(),
        SimplicityConflictResolver.getInstance(),
        LoadOrderConflictResolver.getInstance()
    };
                
  
//Wrap this up into one composite resolver
  CompositeConflictResolver resolver = 
    
new CompositeConflictResolver(
      conflictResolvers);
                        
  
//Specify this resolver when we load the rules
  businessRules = RuleBaseLoader.loadFromUrl(
    BusinessLayer.
class.getResource( 
      BUSINESS_RULE_FILE),resolver);

    我们的简单应用由 JUnit 测试驱动,我们不必改变 Drools 处理规则冲突的方式。知道冲突解决方案怎样运作是很有用的,尤其当你的应用为了迎合更复杂、更苛刻的需求时。
   
结束
   
    本文示范了大部分程序员不得不面对的问题:怎样安排复杂业务逻辑的顺序。我们示范了一个使用 Drools 作为解决方案并引入基于规则编程概念的简单应用,包括了怎样在运行时处理规则。接着,后续文章使用这些技术并展示了怎样在企业级 Java 应用中使用。



阅读全文...

使用SOAP开发java web服务--Axis开发方案


本文的预定读者首先要对j2ee有所了解,熟悉xml,tomcat等基本内容,本文主要是简单介绍一下web服务的基本内容,怎样在java web开发中构建SOAP服务:
一、SOAP(Simple Object Access Protocol)简单对象访问协议,要了解SOAP,首先就需要了解分布式计算的由来,随着下一代的分布式计算体系web服务的出现,SOAP成为了创建和调用通过网络发布的应用程序的实际通信标准。SOAP类似传统的二进制协议IIOP(CORBA)和JRMP(RMI),但它不采用二进制数据表示法,而是采用使用XML的,基于文本的数据表示法。
通过XML表示法,SOAP定义了一种小型有线连接协议和编码格式,以表示数据类型、编程语言和数据库,还可以使用各种Internet标准协议作为其消息传输工具,还可以提供表示RPC和文档驱动的消息交换等通信模型的约定。请注意,W3C正致力于SOAP的研究,http://www.w3c.org/2000/xp/Group/ ,并得到了主流供应商的积极响应,以便对于基于XML的协议相关的重要任务达成共识,并定义其关键要求和使用场景。
SOAP1.2的基本规范定义了以下基本内容:
1)用于将XML文档表示为结构化SOAP消息的语法和语义
2)在SOAP消息中表示数据的编码标准
3)用于交换SOAP消息的通信模型
4)SOAP传输等底层协议的绑定
SOAP消息主要包括了信封头,消息头,主体,附件几部分
一个简单的SOAP消息表示:
POST /StudentInfo HTTP/1.1
Host:anthropology.cun.edu
Content-Type: text/xml;charset="utf-8"
Content-Length: 640
SOAPAction: "GetStudentInfo"

<SOAP-ENV:Envelop xmlns:SOAP-ENV="http://www.w3c.org/2001/06/soap-envelope"
xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3c.org/2001/XMLSchema"
SOAP-ENV:encodingStyle="http://www.w3c.org/2001/06/soap-encoding">
<SOAP-ENV:Header>
<person:mail xmlns:person="http://www.cun.edu/Header">xyz@cun.edu
</SOAP-ENV:Header>

<SOAP-ENV:Body>
<m:GetStudentInfo xmlns:m="http://www.cun.edu/jws.student.studentInfo">
<student_name xsi:type='xsd:string'>
Wang wen yin
</student>
</m:GetStudentInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelop>
以上是1.2版本命名空间,1.1的命名空间 SOAP ENVELOPE:http://schemas.xmlsoap.org/soap/envelop/ ,SOAP ENCODING: http://schemas.xmlsoap.org/soap/encoding/
关于SOAP编码规范请参阅www.w3c.org/TR/xmlschema-2/ 定义的编码值,其他的一些规范可以上http://www.w3c.org/ 上具体查看。
二、以下从实际例子来学习,这里我使用的是Apache的一个子项目Axis的具体例子,便于深入了解soap的运行:
1)下载Axis的相关内容http://ws.apache.org/axis/
2)建立一个实例程序(遵守j2ee的web程序规范),如(WebServiceTest目录)
把axis中lib文件夹的内容拷到你的WebServiceTest/WEB-INF/lib下,同时上网下载xerces(下载地点:http://xml.apache.org/xerces-j/)解释器的包文件xerces.jar,也拷到WebServiceTest/WEB-INF/lib文件夹下,(若要配置log4j,请把属性文件log4j.properties拷到WebServiceTest/WEB-INF/classes文件夹下)
3)修改应用程序WebServiceTest/WEB-INF中的web.xml文件:主要servlet设置如下
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/servlet/TestServlet</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>


<servlet>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>

<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>

<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
你现在可以在网址里输入http://localhost/WebServiceTest/servlet/TestServlet 看到了吗?Axis是使用axis.jar包里的org.apache.axis.transport.http.AxisServlet对应用程序进行处理的,基本配置就讲到这里。
三、接着我们来说Axis中的内核。
1)不使用Tomcat引擎运行Axis。
先建立一个脚步文件,对环境变量classpath进行设置要把lib下的那些包文件的路径全都包括进去,运行:java org.apache.axis.transport.http.SimpleAxisServer <port>
2)内部服务处理程序是org.apache.axis.providers.java.RPCProvider,标志出服务所需的方法,然后提供从SOAP请求消息组成部分的参数。
3)Axis的应用程序端管理功能:
java org.apache.axis.client.AdminClient 就会列出参数,可供你选择。我们的例子是:java org.apache.axis.client.AdminClient -l http://localhost/WebserviceTest/servlet/TestServlet list 就会显示出服务列表,返回的是xml文件
4)wsdl2java应用程序可以把wsdl文件创建基于java的程序,如占位程序等
java org.apache.axis.wsdl.WSDL2java <url>
Axis的基本内容说到这里
四、具体例子
1)编写逻辑程序,简单如:SoapTest.java
public class SoapTest{
public String getStr(String name){
return "Hello,"+name;
}
}
2) 部署服务,编写wsdd文件SoapTest_deploy.wsdd:
<deployment name="SimapleTest" xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
<service name="SoapTest" provider="java:RPC">
<parameter name="className" value="SoapTest"/>
<parameter name="allowedMethods" value="getStr"/>
</service>
</deployment>
其中className参数是你的想部署的类名(全名),allowedMethods是调用的服务的方法,如果有多个方法的话可以用空格分开(如: <parameter name="allowedMethods" value="getStr getMoney"/>),当用*的时候表示全部。
好了现在准备部署了,确保环境路径classpath设置正确,运行:
java org.apache.axis.client.AdminClient -l http://localhost/WebserviceTest/servlet/TestServlet SoapTest_deploy.wsdd
(这里不懂的话,请参考以上的说明)
ok,呵呵,至此,我们已经完成了一个web服务的部署:测试http://localhost/WebServiceTest/servlet/TestServlet 看里面是否多了一个选择SoapTest服务?
如果不想要服务了那重新编写一个wsdd文件,内容改为:
<deployment name="SimapleTest" xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
<service name="SoapTest"/>
</deployment>
和上面一样,对比一下就ok了。
五、客户端测试:
客户端我们也可以使用java来进行测试,网上也有资料的,你可以去学习,很简单的。现在为了体现web服务的魅力,我用.NET平台来测试吧,客户端使用c#编写(先要安装.net framework sdk):
1)通过wsdl生成web服务代理,在net平台下运行:
wsdl /l:CS /protocol:SOAP /out:SoapTestClient.cs http://localhost/WebserviceTest/services/SoapTest?wsdl
我们通过wsdl得到了一个cs文件SoapTestClient.cs(当前目录),你可以打开cs文件,研究一下里面的代码,那个getStr(string name)就是我们需要调用的方法,我们的客户端通过调用该方法就可以调用服务器端的方法,内部的转化wsdl.exe工具已经帮我们完成了,axis下的WSDL2Java工具也是一样的功能,可以参考我上面所说的关于Axis的内核内容
2)编译cs文件成程序集dll:
csc /target:library /r:System.Web.Services.dll /r:System.Xml.dll SoapTestClient.cs
最后我们等到了一个dll文件SoapTestClient.dll,客户端程序通过调用它就行了
3)编写客户端应用程序SoapTestClientApp.cs
using System;

namespache jws.client{
public class SoapTestClientApp{
public SoapTestClientApp(){
}
public static void Main(string[] args){
if(args.Length!=1){
Console.WriteLine("Usage:SoapTestClientApp <name>");
Environment.Exit(1);
}
SoapTestService st_service=new SoapTestService();
st_service.getStr("Wang wenyin");
}
}
}
4)编译文件csc /r:SoapTestClient.dll SoapTestClientApp.cs
运行SoapTestClientApp
输出结果:
Hello,Wang wenyin
与预期结果相符。

好了,关于soap开发web服务就说到这里了,希望这篇文章能对大家有所帮助,谢谢了:)有问题的话可以留言,也可以跟我联系 gdanthrowwy@126.com


阅读全文...

指标,模型,权数等知识(要了解)


指标
预期中打算达到的指数、规格、标准
按指标接受人员

模型
即通俗的条件

权数
在统计计算中,用来衡量总体中各单位标志值在总体中作用大小的数值叫权数。
权数决定指标的结构,权数如变动,绝对指标值和平均数也变动,所以权数是影响指标数值变动的一个重要因素。权数一般有两种表现形式:一是绝对数(频数)表示,另一个是用相对数(频率)表示。相对数是用绝对数计算出来的百分数(%)或千分数(‰)表示的,又称比重。平均数的大小不仅取决于总体中各单位的标志值(变量值)的大小,而且取决于各标志值出现的次数(频数),由于各标志值出现的次数对其在平均数中的影响起着权衡轻重的作用,因此叫做权数。这说明权数的权衡轻重作用,是体现在各组单位数占总体单位数的比重大小上。如工业生产指数中的权数是对产品的个体指数在生产指数形成过程中的重要性进行界定的指标。产品的重要性不同,在发展速度中的作用不同,产品或行业占比重大的,权数就大,在指数中的作用就大。工业经济效益综合指数中的权数是根据各项指标在综合经济效益中的重要程度确定的。(参阅第38题)零售物价指数除选用代表规格品计算个体物价指数外,还要采用零售额为权数,对个体商品物价指数在物价总指数形成中的重要程度起着权衡轻重的作用。


阅读全文...

人气指数指标的体系构建和模型选择



□ 作者:暨南大学经济学院 吴云凤 刘斌锋

最早使用“人气”这个词的是香港的娱乐圈,他们经常使用“人气”的高低来形容一个歌星或影星受欢迎的程度,如,我们经常听到的某某歌星的人气很高,等等。渐渐的“人气”成了一个通用的词汇,“人气”的概念也开始用于表示社会公众对企业的认同和信心。某个品牌的“人气”高说明它受到了人们的认同;某个企业人气高说明人们对它有信心;等等。其实,所谓“人气”,是指特定环境中外界对事物的理解、喜爱和认同,它与形象、品德、能力心态等多种因素有关。为了提高企业的人气,我们开始关心怎样来衡量企业 “人气”的高低。这个时候,可以采用编制人气指数来衡量人气的高低。对人气指数我们可以这样理解,它是上述现象在不同个体上进行比较分析的一种相对比率,它往往是由一个测评指标体系得出,既可以是动态的也可以是静态的,是用来评价一个人或事物的“人气”的指标。
  
  人气指数指标体系的构建
  
  人气指数指标体系构建原则
  人气指数编制的成功与否,和测评指标体系的构建是密切相关的。在编制时必须依据研究的目的和遵循一定的原则,才能得到比较科学的指标体系。
  可比性原则:人气指数既可以在各个个体之间进行横向对比,也可以在某个体不同时期的竞争力之间进行纵向对比。
  动态性原则:人气指数也是个动态的概念。我们评价这样一个动态性的概念不能用一些一成不变的指标,而选定的指标体系也应具有动态可变性,这样才能准确度量个体的“人气”。
  定量指标与定性指标相结合:为了准确构建评价指标体系,我们应选用定性分析和定量判断相结合的办法,以定量指标体系为主体,辅助以不能量化的定性指标做参考,进而达到综合评价“人气”的目的。
  需要与可能原则:虽然需要但难于取得的资料的指标,宁可不要。
  间接计量原则:“人气”实际上是不能直接量化的,但我们可以利用一些间接计量的指标来反映,并借助问卷调查来实现。

  人气指数指标体系的设计
  指数测评指标体系是人气指数测评的核心内容,是测评模型的具体化,也是调查问卷设计的基础,其合理性决定了采集的人气指数数据的合理性和有效性。因此,指数测评指标体系的设计过程中,下一级指标必须准确的把握上一级指标的含义,问卷的设计必须反映第三级指标的含义,并且要把相关的观测变量(第三级测评指标)准确的转化为问题的形式,只有这样获得的人气指数数据才能较准确的反映测评模型想达到的目标。
  人气是一个不好捉摸的东西,不能对它进行直接的计量。但我们可以从影响人气方面的因素进行分析,以找到合适的间接指标测评体系对它进行量化。对一个企业来说,人气的高低实际上就是社会公众对他的承认,而这种承认来自于公众对企业的评价。对公众来说,评价一个企业主要是有这样的几个方面:对企业的认知程度、对企业及其产品和服务的评价、对企业的现在的资金和利润情况的认识、对企业将来的产品和服务的价值和质量的预期。我们可以从这几方面着手构建指标体系(见图1)。
  从现实层面上看,我国的经济发展水平与发达国家还有一定的差距,企业和市场结构也有自身的特点。我们在深入分析国外类似的指数测评模型的基础上,通过建立上面的指标体系,来构建人气综合指数。
  
  数据的处理
  
  信度分析
  一般来说,构成人气指数的指标体系中指标的资料往往通过问卷调查取得,这时在数据整理、编制指数的过程中就必须考虑到这一点。我们首先必须弄清数据的可靠程度,信度分析是为了检验测评收集的数据反映人们评价的可靠程度。在人气指数测评中可以通过克郎巴哈α信度系数方法来测量调查数据的信度。克朗巴哈信度系数的计算公式是 :
  其中K:调查数据的种类数
  σi2:调查数据中,第i个测评指标满意度得分的题内方差
  σr2:调查数据中,测评指标总得分的方差
  在这种信度测评方法中,一般认为α得分在0.7以上调查数据的信度即为较高。
  指标的处理
  一致化处理:我们在评价人气指数时,从问卷的到的数字资料可能有极大型、居中型和极小型,所以对不同类型的数字资料应采用不同的一致化方法。
  对极小型指标x,令x*=1/x..
  对居中型指标x,令
  其中m为指标x的一个允许下界,M为x的一个允许上界。
  标准化处理:为了能更准确地进行比较,对于有量纲的指标通常要进行无量纲化。现采用标准化法对原始指标单位进行无量纲化处理。
  其中 是指标x的观测值的平均值,Sj是指标x的观测值的均方差。
  
  确定权数和选择相应的模型
  
  确定人气指数指标的权数,既要考虑其科学性,又要考虑其可操作性。我们一般要结合统计研究的目的和指标的特点,确定指标的权数。考虑到我们的指标是间接量化指标,和人气的关系比较复杂。在此,对权数的问题我们可以利用德尔斐法、专家打分法、层次分析法等各种方法之一,结合我们所研究事物的特点来确定,这样一般可以得到令我们满意的、比较合理的权数。
  对汇总指标的模型的选择。我们知道,一只木桶的容量是取决于长度最短的那块木板(因为当液体平面超过那块木板的长度时,液体就会溢出)。而人气指数的指标也有这样的特点,即当知名度、美誉度、信心这三方面之一的指标值很小时,会对企业的“人气”产生很大的影响。同时,考虑到在指标体系里的各指标间有较强的关联。因此,应该选择可以全面、协调的评价各个指标的评价模型。
  该模型为:
  其中,I是某个企业在评价模型里的得分;yi是该企业在某一问卷里的得分;N是问卷数;λ1和λ2是加法型评价模型和乘法型评价模型得分所占的比重,且λ1+λ2=1;xj是某个指标的数值;ωj(1)是在加法型评价模型里指标的权重;ωj(2)是在乘法型评价模型里的权重;m是指标的个数。
  
  定标准值并进一步计算
  
  单个企业人气各时期人气指数的编制。单个企业人气指数,必须确定某一年为基期,以这一年在步骤三中的得分I为标准值,以此数值为基期计算报告期的人气指数,通常确定基期的人气指数为100,而报告期的结果如果大于100,则反映出该人气上升,反之,则“人气”在下降。
  多个企业人气指数的编制。人们往往更关心多个企业之间“人气”的相对情况,所以编制多个企业的人气指数就显得非常重要。其标准值确定的主导思想是,为保证人气指数的最大值为100,可以取再步骤三中企业最大的I的数值为标准值,然后将其他企业的得分I和这个标准值进行对比,这样就可以得到多个企业的人气指数了。通过以上的四个步骤,再加上进行问卷调查取得相应的原始数据,我们就可以得到企业的人气指数了。
  “人气”所反映的品牌知名度、美誉度和信心(即公众认同的品牌竞争力)对产品市场的竞争力和要素市场的竞争力都有很大的作用。企业拥有品牌竞争力,就可以销售更多的产品,提高其产品在市场上的占有率及企业赢利水平;而较强的赢利能力则是企业向员工提供更好待遇的基础,员工待遇和满意度的提高就可以吸引更多高素质的员工。企业拥有较好的社会形象,可以提高其社会信用度,从而获得更多的融资渠道,降低企业的融资成本。所以,具有公众认同的品牌竞争力的企业,在产品市场和要素市场上都会表现出较强的竞争力。


阅读全文...

税收分析


  钱冠林指出,提高税收征管的质量和效率,就是要尽可能地使实征税收接近法定税收,实际税负接近法定税负,最大限度地减少税收流失,这是税收管理的最终目的,也是税收工作永恒的主题。税收分析是税收管理的眼睛,对及时准确地发现问题,有的放矢地解决问题,加强税源管理和征收管理起着重要的导向作用。各级税务机关特别是计统部门,要全面认识税收分析在税收工作中的重要地位,坚决摒弃税收分析只是为完成收入任务服务、税收分析只是为应付上级一时之需的错误观念,将税收分析的主要目标切实转移到为加强征管服务、提高税收征管的质量和效率,更好地组织收入上来,并以此带动为税制改革服务和为宏观调控服务职能更加有效地发挥。
  钱冠林认为,根据几年来税收分析工作的实践,深化税收分析应紧紧围绕以下几个方面进行:
  一是税收弹性分析。税收弹性是税收增幅与经济增幅的对比。开展税收弹性分析,可以反映税收增长与经济增长是否协调,并据此对收入形势是否正常作出判断;可以通过对税收增长与经济增长不协调原因的剖析,进一步查找影响税源和税收变化的因素,从中发现征管中存在的薄弱环节和漏洞。弹性分析是深化税收分析必须紧紧抓住的一条主线,在税收分析中具有普遍意义。在开展税收与经济对比分析中,不仅要从总量上进行经济增长与税收增长的弹性分析,而且要从分量上、从税种、税目、行业以至企业等税收弹性看税收与经济增长的协调性。做好税收弹性分析要注意剔除税收收入中的特殊因素,以免其影响真实的弹性,掩盖税收征管中的问题。根据目前情况,要进一步加强增值税与增加值、企业所得税与企业利润的弹性分析,积极进行消费税、营业税各税目与相关经济指标的弹性分析,加快开展各地方税种与对应税基的弹性分析。通过深入细致的弹性分析,深挖税收与经济不适应的根源,解决管理中存在的问题,促进税收与经济协调发展。
  二是税负分析。税负是税收规模与经济规模的对比。开展税负分析可以反映税务机关征收管理力度和成效,从中发现管理中存在的问题。开展税负分析是提高税收征管质量和效率的一个重要抓手和突破口。首先,要进行地区、税种和行业的宏观税负分析,如地区税收总量与地区经济总量对比,工商业增值税与工商业增加值对比,企业所得税与企业利润对比,行业税收与行业经济指标对比等,反映宏观层面的税负情况。其次,要利用微观经济和税收数据开展针对企业层面的微观税负分析,如企业销售收入与实现税金对比、计税所得额与应纳所得税对比;还要将宏观税负与微观税负分析相结合,进行税负综合分析。税负分析中要注意进行五个比较,即实际税负与法定税负的比较,不同地区之间的宏观税负比较、同行业税负比较、税种税负比较,以及企业税负与所属行业平均税负的比较。通过这些比较来揭示实际税负与法定税负的差异,揭示地区、行业、企业以及税种税负之间的差异和动态变化,据此评判检验税收征管的努力程度,按照“宏观看问题、微观找原因”的思路,将问题提交管理部门进行纳税评估,真正找出管理上的漏洞。
  三是税源分析。税源是经济发展成果在税收上的体现,是税收的起点,因而也是税收征管、税收分析的起点。开展税源分析的目的,就是要了解真实税源状况,判断现实征收率,并据以查漏补缺,应收尽收。但长期以来,我们将税收分析、加强征管的注意力主要集中在从申报、征收到入库这一过程上,忽视对真实的税源状况的分析监控和管理。可以说,不研究税源,不分析税源,不了解税源,提高税收征管的质量和效率就是一场空谈。深化税源分析,就是要将税收分析环节前移,将应征数纳入到税收分析中来。不仅要分析纳税申报表上的应征数,更应该分析反映真实税源的应征数。
  为此,要充分利用现有数据,通过对企业生产经营活动成本、利润和税负率等指标的分析,对企业财务核算和纳税申报质量进行评判。要积极引进工商、银行、统计以及行业主管部门等外部数据,实现各外部独立数据与纳税人申报数据信息的比对分析,解决税务机关与纳税人信息不对称的问题,更为准确地判断企业税源状况,提高税收征收率。还要通过对各宏观经济数据的分析,加强各税种税基的研究,推进增值税、营业税、企业所得税等主要税种的纳税能力估算,从宏观层面对各地、各税种税源状况和征管力度进行测算分析,努力减少税收流失。
  四是税收关联分析。税收关联分析主要是对有相关关系的各类税收数据进行的对比分析,其目的是通过对比发现企业财务核算、纳税申报中的异常情况以及税款征收中的问题。如发票销售额与申报表应税销售额、申报应征税收与入库税款和欠税、增值税与所得税、房产税与契税、宏观经济和企业财务与税收税源等数据之间存在着广泛的关联性。通过不同数据的相互分析验证,可以发现税收管理上的问题。关联分析已经在实际工作中发挥出了较大的作用,如通过增值税交叉稽核系统对进、销项税金的对比分析,国税、地税间就交通运输业发票开具和抵扣情况的对比分析,以及对海关完税凭证、农副产品发票、废旧物资发票等进行的对比分析,直接带动了税收管理水平的提高。随着信息化建设的继续推进,各种数据信息量迅速增加,各级税务机关必须抓住时机,充分利用综合征管信息系统数据、税收会统核算数据、重点税源监控数据以及经济部门和企业财务等数据,开展税收关联分析,及时、有效地发现税款申报征收中存在的问题,加强税收管理。
  钱冠林表示,税收弹性分析、税负分析、税源分析和税收关联分析,是深化税收分析的四种主要分析形式,既相对独立,又密切相关。在实际工作中,要将上述四种分析形式与税收完成情况分析以及税收资金形态分析等有机结合起来,更加全面、完整地反映税收和税源状况,更加及时、准确地反映税收管理中存在的问题,提出有价值的意见和建议,更好地为提高税收征管的质量和效率服务。

阅读全文...

项目思路


总体思路:作为项目来对待,积极准备各地相对通用需要的功能,找到用户后定制开发,其他功能视资源、市场情况待机而动。



阅读全文...

自我认识,自我剖析


每个人都在追求成功,那么到底什么叫做成功?成功的定义是什么?

成功就是得到了自己想要的东西。你内心想得到什么,然后你得到了什么,那么恭喜你获得成功。

在我们的生活中有的人即使得到了很多东西,他却说自己不成功,因为他没有得到他想得到的东西。有的人虽然他没有得到太多的东西,但是他说自己成功了,因为他已经得到了他想要得到的东西。所以,我们一个人要追求成功先要问清楚自己,我到底想得到什么?只有我们清楚自己要什么的时候,上帝才知道给予什么。不过非常遗憾的是我们的生活中有太多的人不知道自己到底需要什么,因为他不能清楚的认识自己。

认识自我,说起来很简单,但是做起来却真的很不容易。我们眼睛都只注视着前方,注视着别人。而且长在头上,高高在上,因此很难弯下腰来,低下头来看自己。结果我们就都只关注别人,却忘记了认识自己。

我们如何来认识自己呢,认识自己,需要从两个方面来认识,一是外在的自我,二是内心的自我,我们大家都知道我们认识一件物品,也是一样先看产品的包装,外观形象,然后再看产品内在的功能。人也同样如此,先看自己的形象,在看内在的品质。

我们每个人都是这个世界上独一无二的个体,我们的形象就决定了人们是否喜欢自己,所以我们一定要清楚地知道自己在客户心中留下的印象,认识到自己应该以什么样的衣着打扮来装点自己。我们不能决定自己的身高和长相,但是我们可以选择自己服装的大小,颜色,品牌,规格来美化自己。

认识自己要从小事做起,从身边的事情做起,养成良好的个人卫生习惯,注重自己的言谈举止,给我们周围的朋友留下一个好印象。三分人才,七分打扮,我们的形象最先就决定我们的朋友是否接纳自己,喜欢自己。只有我们的外观另朋友满意,才有机会让他们了解内在的品质。

在社会上有太多的人,他们不认识自己,不了解自己,却总是在抱怨自己怀才不遇,得不到别人的欣赏和赞美,然后到处说在这个社会没有伯乐。自己生不逢时。因为他不知道这是缺乏自我认识的表现。

人不怕犯错误,最怕的就是自己犯了错误,还不知道错在哪里。有太多的人,总认为自我形象不重要,只要我有能力,还怕没有人接纳吗,所以他不愿意改变他自己。因为你不知道自己错在哪里,又怎么能知道如何改变自己呢。

另外,我们要从外界的环境中认识自我,因为人是生活在社会环境之中,包括我们的工作环境、学习环境、生活环境。如果我们不了解自身的生存环境,不知道自己在生活中的地位,那么我们是无法成长自我,自然很难取得成功。所以我们认识自己,一定要清楚的认识到自己的生活环境,

为什么许多人不能成功,因为多数缺乏对这一方面的认识,有的人好高骛远,有的人自不量力,有的人不思进取,有的人半途而废。其实多数人的失败,不是他能力不够,也不是他努力不够,而是他缺乏自我认识。

如果我们不能改变外界的环境,那么我们可以改变自己的思维方式。我们是适应环境,还是重新选择新的环境,或者通过提升自己然后来改变环境。这就在于我们对自我的认识。我们不能与社会背道而馳。我们只有先接纳环境,在社会环境中根据自己能力找到自己的位置。然后在自己工作岗位上发挥自己的才能,逐步实现自我。

关于内心的自我认识,就显得更加重要了。人与动物,人与人之间的差别,取决定性作用的在于我们心灵的成长,如果我们的心灵与其他动物没有区别,那么社会就不会发展,生活就不会进步。也许就是生活在原始社会里。人所以能改变社会,征服自然,在于人的内心深处有一种巨大的潜能在推动着人类不断地向前发展。人是可以通过思想来改变命运的高级动物,事实上,成功者与失败者之间的区别也是我们内在思想的区别。人的体能是有限的,但智能是无限的,认识自己的关键就是认识自身的智能,只有我们认识到自身智能的作用力,才能充分发挥智能的效益。

其实,在这个社会最大的浪费不是自然资源的浪费,而是人类潜能的浪费。社会上的煤炭,石油,天然气,太阳能,等等一切自然资源,如果我们这一代人没有利用,那么我们后一代人可以开发。只有人的能力自己不使用就会随着生命的终止而消失。谁也没有办法把你的思想,才能折价卖给后一代人,那怕自己的子女。所以认识自己最重要的认识到我们思想完全决定我们的命运。如果我们希望改变自己的命运,那么就好好利用自己的思想。

我不能改变社会、改变国家、改变企业、改变别人,但是我完全可以改变自己。我可以控制自己的思想、我可以调整自己的心情、我可以提升自己的能力、我可以决定自己的行为、我可以选择自己的生活方式。认识自己就是认识到自己的优势和劣势,然后充分发挥我们的优势,展现自身的才能。

我们都在想着成功,非常的渴望成功。但是我们多数的人都在别人身上找成功,却不从自己身上挖掘自己的才能。只在盲目的追求,不清楚自己到底要什么,做什么,没有自己的目标和方向。因为他们不认识自己。把自己的思想,信心,希望,都寄托在别人身上,所以一旦事情发生转变,就找不着方向。这种人在我们的生活中太多太多。他们不知道自己能干什么?不知道自己想干什么?也不明白自己真正要干什么?所以,这些人总是跟在别人的背后干事情。看见别人干什么,成功了,就一哄而上。结果大家都没有做好,然后又跟在别人后面找出路。这就是多数人之所以不成功的原因。

成功者都只所以成功,是做别人做不到的事情、做别人不愿意做的事情、做别人不敢做的事情。而这些事情只有认识自我的人,他才能做到以上三点。因为他清楚自己做事的目的和目标。

信心来自哪里?多数人的信心建立在别人身上,他们很在乎别人的评价。特别是亲朋好友的评价,多数人的思想和行为是受到家人和朋友的影响,为什么他们会把自己的信心交给别人呢,因为他们不认识自己。然而,人们多数又喜欢用自己的标准来衡量别人,如果我们都按照父母亲的意愿来生活,来制定自己的人生,那么我们会成功吗?也许父母今天的生活就是我们明天的生活。成功需要与众不同,改变就是从认识自我开始。

我们每个人都是自己命运的主宰者。我们出生在哪里并不重要,重要的是我们要去向何方。父母亲怎么样并不重要,重要的我们要怎么度过自己美好的一生。我们要充分认识到自己的潜能。我们完全有能力改变自己的生活,也许我们不能改变我们的父母,改变我们的家乡,但是我可以改变自己。

如何改变自己呢,一切的改变来自己于心灵的改变,心灵改变,思想改变。思想改变,行为改变。行为改变,结果改变。成功者是因为相信才做,失败者因为做了才相信。因此成功者与失败最大的区别是信心的区别,成功者相信自己,失败者怀疑自己。为什么成功会相信自己呢,其实他不是一种盲目的信心,而是因为他已经清楚地认识了自己能力。他知道自己有所知,有所不知,有所为,有所不为,所以他有自己的主见,他不会受到别人言语所左右,所支配。他清楚自己做事的目的性。

我们有许多成功学都讲到过心态和技巧,如何来调整心态,掌握技巧呢,关鍵同样是在于我们的自我认识。许多人为什么心态不好,那是认识不到自己心态会对自己的工作,生活,学习带来多大影响。意识到心态不好的问题严重性。所以我们大多数都感情做事,然后做完以后以后悔。如果稍微有一点自我认识的人,他能克制自己的情绪。冷静的处理问题。

技巧同样如此,如果我们不认识自己,不衡量自己的能力,盲目地跟着别人学这个方法,那个方法,虽然方法学了一大堆,但是运用起来才会发现方法不管用,因为不是任何一种方法都适合自己。每个成功的方法都必须符合当时的历史背景,所有的学习都只是参考。真正运用必须根据自己的实际情况来操作。而决不能把成功的方法照搬。否则只有步入失败的后尘。所以成功源于认识自我。




阅读全文...