熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

用javascript模擬C#的[Attribute]用法

2013-11-23 18:42:20  來源: Java核心技術 

  <!用Js模擬C#的Attribute>
  執行結果<br>
  <textarea rows = cols = id = output></textarea><br>
  <br>
  調試信息<br>
  <textarea rows = cols = id = debug></textarea><br>
  
  <script language=javascript>
  /* 特性(Attributes)是一種嶄新的聲明性信息
  我們不僅可以通過特性來定義設計層面的信息
  (例如help file URL for documentation)
  以及運行時(runtime)信息(例如使XML與class相聯系)
  而且我們還可以利用特性建立自描述(selfdescribing)組件
  */
  
  function Attribute() //Attribute 基類可以自行定義其中的接口以擴充功能這裡只是一個簡單的演示因此留空
  {
  
  }
  
  function TestMethod() //定義一個新的Attribute類 TestMethod用它來給需要進行單元測試的方法提供額外信息
  {
  thisname = TestMethod;
  }TestMethodprototype = new Attribute();
  function TestMethodAttribute() //必需的執行方法
  {
  return new TestMethod();
  }
  
  function DebugOutput(bOutput) //定義一個新的Attribute類 DebugOutput用它來指示是否在測試中輸出額外的調試信息
  {
  thisname = DebugOutput;
  thisisAllowDebugOutput = bOutput;
  }DebugOutputprototype = new Attribute();
  function DebugOutputAttribute(bOutput) //必需的執行方法
  {
  return new DebugOutput(bOutput);
  }
  
  Function__captureAttributes = function(obj)
  {
  var attributeDef = /\[\w+\]*\n*(?=\=[\s]*function)/g;
  var matches = nstructortoString()match(attributeDef);
  if(matches != null)
  {
  for (var i = ; i < matcheslength; i++)
  {
  var part = matches[i]split(/[\s\n]/);
  var attrLists = part[]split();
  var methodObj = eval(part[partlength]);
  methodObj__attributes = new Array();
  methodObj__attributes__all = new Array();
  
  for (var j = ; j < attrListslength; j++)
  {
  if(!/^+\(*\)$/test(attrLists[j]slice()))
  {
  attrLists[j] = [ + attrLists[j]slice() + () + ]; //處理省略括號的情況
  }
  if(!/^+Attribute$/test(attrLists[j]split(()[]))
  {
  attrLists[j] = attrLists[j]split(()[] + Attribute + ( + attrLists[j]split(()[];
  }
  
  var attrObj = eval(eval(attrLists[j])[]);
  methodObj__attributes__allpush(attrObj);
  methodObj__attributes[attrLists[j]split(()[]replace(/[\[\]]/g)replace(/Attribute$/g)] = attrObj;
  methodObj__attributes[attrLists[j]split(()[]replace(/[\[\]]/g)] = attrObj;
  }
  }
  }
  }
  
  function UnitTest() //單元測試框架被賦予[TestMethod]特性的方法會被作為Case執行測試
  {
  thiserrors = ;
  thispassed = ;
  //聲明TestMethod特性testString方法將被runCase方法執行同時聲明了DebugOutput特性將返回的信息輸出到調試窗口
  //特性的聲明必須放在被指定特性的方法之前而且要獨占一行如果有多個特性可以以逗號分隔
  //包含特性聲明的函數要以;結尾不可省略
  [TestMethod][DebugOutput(true)]
  UnitTestprototypetestString = function() //測試字符串方法這裡假設自己實現了一個String類然後來測試
  {
  var testCase = new String();
  testCase = abc;
  thisTest(testCase == abc); //測試賦值操作
  testCase += def;
  thisTest(testCase == abcdef); //測試連接操作
  thisTest(testCaselength == ); //測試長度屬性
  
  selfoutputvalue += \n;
  var result = Debug testString finished with + thispassed + cases passed and + thiserrors + cases failed!\n;
  thispassed = ;
  thiserrors = ;
  return result;
  };
  //只測試不輸出調試信息的方法
  [TestMethod]
  UnitTestprototypetestRegexp = function()
  {
  var errors = ;
  var passed = ;
  if(/abc/test(abc))
  {
  selfoutputvalue += ;
  passed ++;
  }
  else
  {
  selfoutputvalue += e;
  errors ++;
  }
  if(/abc/test(aababcd))
  {
  selfoutputvalue += ;
  passed ++;
  }
  };
  
  //不被測試的方法
  UnitTestprototypefoo = function()
  {
  alert(foo not being tested!);
  };
  UnitTestprototyperunCases = function()
  {
  for (each in this)
  {
  if(this[each]__attributes != null && this[each]__attributes[DebugOutput] != null)
  {
  var result = this[each]call(this);
  if(this[each]__attributes[DebugOutput]isAllowDebugOutput)
  {
  selfdebugvalue = result;
  }
  }
  else if(this[each]__attributes != null && this[each]__attributes[TestMethod] != null)
  {
  this[each]call(this);
  }
  }
  };
  UnitTestprototypeTest = function(cond)
  {
  if(cond)
  {
  selfoutputvalue += ;
  thispassed ++;
  }
  else
  {
  selfoutputvalue += ;
  thiserrors ++;
  }
  };
  //在類內部捕獲Attribute對象必須在使用特性的對象內部聲明這一點同C#還是有區別的
  Function__captureAttributes(this);
  }
  
  var test = new UnitTest();
  testrunCases();
  //或許一些人不太習慣上面的這種做法但是它有一個顯而易見的好處就是我如果希望添加更多的單元測試用例只需要增加新的標記為[TestMethod]的方法而不用修改runCases方法的任何代碼!這樣我就可以將整個單元測試框架封裝起來而依然允許使用者從外部添加自己的測試方法!
  
  //除此以外我們可以用特性相當便利地用來實現許多模式這方面的具體深入用法這裡不再詳述了有興趣的朋友可以自行嘗試^^不過現在這個模擬的特性還有一些不足之處例如只能將特性聲明到對象方法而不能聲明給對象本身這樣要實現一些像Serializable之類的對象特性就不太方便了==
  </script>
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25602.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.