UI控件设计的一点心得

最近在做一个关于控件集设计的项目,总体感觉很有趣,也学到了很多东西。
为了使这点东西对我以后有点帮助,我不惜在上班时候小小抽出一点时间来做一下笔记。

 1 在写Textbox控件的共通方法时候,看到了3个需求,前2个是输入的值验证,
第一个验证是,输入值得值是否允许输入,第二个验证是,输入值是否不允许输入。第三个是
利用正则表达式,验证输入的值。刚开始我比较迷茫,因为我的想法来看,
3个需求完全可以由一个bool CheckXXX(String regexp,String Value)来解决。
于是我向上级发了Q&A,也正是由于这个Q&A让我懂了很多知识。虽然从技术层面上,
这3个控制都可以由正则表达式来实现。
比如:
     StringUtil.CheckCharsInputable("abcde", value)
    和
     StringUtil.CheckFormat("[abcde]*", value)
其实可以做一样的事情。但是面向的使用对象不同。对于正则表现理解比较深的人可以这样。
但也存在正则用的不是很好地,或者不会者。这就大大的增加了程序出BUG的机会。所以为了避免
这样的情况发生,我们宁可在开发阶段来避免。

例如
  在写StringUtil.CheckCharsUninputable(",/"", value)
     (不能输入「,」和「"」的验证)
    的时候、就有可能会发生重大BUG的可能性。
  由于开发者的正则理解错误方法变成了
     StringUtil.CheckFormat("[,/"]", value)
    这样不就引起了错误么。

从性能方面考虑,
  一般单纯的对文字的验证会远远比用正则表达式的时候情况多,
加上对于文字的验证,利用数组迭代的方法来做比用正则来实现效率要快的多。
例:文字验证与入力格式验证的比率为9:1的时候

        <各种处理的时间用例>

          验证文字(用数组迭代实现) 1ms
          验证格式(用正则实现) 10ms

        ・都用正则实现的场合

          1ms × 90回 + 10ms × 10回 ⇒ 190ms

        ・验证文字用数组,验证格式用正则的时候

          10ms × 90回 + 10ms × 10回 ⇒ 1000ms

       虽然这个数据不确切 但是从真正意义上,
  用其他方法要比用正则来实现要好这一点是没错的
所以最终把我说服了。但是前面的那个理由接受起来其实还是比较容易的,

但是后面那个效率性的说明,就小小有点不服,我就写了一个程序小小测试一下。

下面贴个小小代码。我是才毕业的学生,写出代码质量比较差,请各位大大包含。主要还是留给我以后自己YY的

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. using System.Runtime.InteropServices;
  6. namespace ConsoleApplication4
  7. {
  8.     class Class2
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             Console.WriteLine("this is a test for testing the efficiency of three method:");
  13.             Console.WriteLine("Target:check the uninputChar");
  14.             bool ret;
  15.             string cc = "";
  16.             string aa = "";
  17.            
  18.             do
  19.             {
  20.                 cc = Console.ReadLine();
  21.                 for (int i = 0; i < 20000; i++)
  22.                 {
  23.                     aa += cc;
  24.                 }
  25.                 if (!cc.Equals("exit"))
  26.                 {
  27.                     Console.WriteLine("========================CheckByRegex=========================");
  28.                     HighResolutionTimer timer = new HighResolutionTimer();
  29.                     timer.Start();
  30.                     ret = checkbyRegex("^[^,]+$", aa);
  31.                     timer.Stop();
  32.                     Console.WriteLine("thr Result of checkbyRegex:" + ret.ToString() + " time: " + timer.ElapsedTime);
  33.                     Console.WriteLine("=============================================================");
  34.                     Console.WriteLine("========================checkbyArray2=========================");
  35.                     timer.Start();
  36.                     ret = checkbyArray2(",//", aa);
  37.                     timer.Stop();
  38.                     Console.WriteLine("thr Result of checkbyArray2:" + ret.ToString() + " time: " + timer.ElapsedTime);
  39.                     Console.WriteLine("=============================================================");
  40.                     Console.WriteLine("========================checkbyArray1=========================");
  41.                     timer.Start();
  42.                     ret = checkbyArray1(",//", aa);
  43.                     timer.Stop();
  44.                     Console.WriteLine("thr Result of checkbyArray1:" + ret.ToString() + " time: " + timer.ElapsedTime);
  45.                     Console.WriteLine("=============================================================");
  46.                     
  47.                 }
  48.             } while (!cc.Equals("exit"));
  49.         }
  50.         private static bool checkbyRegex(string regstr, string value)
  51.         {
  52.             Regex r = new Regex(regstr);
  53.             return r.IsMatch(value);
  54.         }
  55.         private static bool checkbyArray1(string chars, string value)
  56.         {
  57.             char[] arr = chars.ToCharArray();
  58.             foreach (char ch in arr)
  59.             {
  60.                 if (value.IndexOf(ch)>0)
  61.                 {
  62.                     return false;
  63.                 }
  64.             }
  65.             return true;
  66.         }
  67.         private static bool checkbyArray2(string chars, string value)
  68.         {
  69.             char[] arr = chars.ToCharArray();
  70.             bool ret = true;
  71.             foreach (char ch in arr)
  72.             {
  73.                 ret &= (value.IndexOf(ch) < 0);
  74.             }
  75.             return ret;
  76.         }
  77.     }
  78. }
  79. public class HighResolutionTimer
  80. {
  81.     [System.Runtime.InteropServices.DllImport("KERNEL32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
  82.     private static extern bool QueryPerformanceCounter([In, Out] ref long performanceCount);
  83.     [System.Runtime.InteropServices.DllImport("KERNEL32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
  84.     private static extern bool QueryPerformanceFrequency([In, Out] ref long frequency);
  85.     private long start;
  86.     private long stop;
  87.     private long frequency;
  88.     public HighResolutionTimer()
  89.     {
  90.         QueryPerformanceFrequency(ref frequency);
  91.     }
  92.     public void Start()
  93.     {
  94.         QueryPerformanceCounter(ref start);
  95.     }
  96.     public void Stop()
  97.     {
  98.         QueryPerformanceCounter(ref stop);
  99.     }
  100.     public float ElapsedTime
  101.     {
  102.         get
  103.         {
  104.             float elapsed = (((float)(stop - start)) / ((float)frequency));
  105.             return elapsed;
  106.         }
  107.     }
  108. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值