好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

技术改进方案模板

技术改进方案模板

技术改进方案模板

来自: http://www.cnblogs.com/raol/archive/2013/04/25/program_template.html
关于XX改进方案

 

现状描述 :

不满意的地方 : 

1.

2. 

技术改进点 :

  1.

  3 

 

当前方案:

方案图

分析

数据分析

改进方案一:

描述: 

 

本方案改进点 : 

1. 

2. 

优点 : 1. 

     2. 

 3.  工作量小 .

缺点 : 1. 逻辑移到了前端

 

备注 :  数据结构

 

方案图

 

 

 

改进方案二 :

描述:  和方案一类似 , 但把矩阵统计移到了后端 ,  增加实时统计模块 .

优点 :  职责分明

 

缺点 :  工作量加大 ,  有

 

备注 :  数据结构 

字段名

                         

 

 

方案图

 

方案评比 :

根据现系统的数据量 ,  使用客户端数 .

方案名

简洁性

可维护性

性能

可扩展性

健壮性

方案一

方案二

×

 

 

 

方案一  详细设计:

方案一为现在采用的方案 ,  详细设计如下 : 

虚线框内为阶段二和阶段三的工作 .

方案一将分三阶段进行

阶段一 : 

1. 

 

阶段二 : 

 

阶段三 :

设计图 UML

 

方案二  详细设计图:

UML

 

 下载:  点击

 

 

 

标签:  设计

设计原则:请重新审视“多重继承”,找机会拥抱一下“掺入(Mixin)”

名称解释

多重继承:我没有使用多重继承的经验,因此这里不多说,大学学的C++,可惜没有学好。

Mixin:一个Mixin是一个方法和属性的集合,不同的语言提供的实现机制不一样。类型定义的时候可以声明他想包含的Mixin(可以是多个),这些Mixin包含的方法会成为类型的一部分。

使用动机 代码复用  AND  运行时不改变。 Mixin是推论,MixinTarget是定理 。如:C#的IEnumerable(MixinTarget)只包含一个方法,根据这个方法(定理)Enumerable(Mixin)扩展了N个方法(推论)。

示例(ExtJs4.2)

  1   //  / <reference path="ext-all-debug-w-comments.js" /> 
  2   Ext.define('Enjoyable' , {
   3       play:  function   () {
   4           console.log( this .getName() + '-play' );
   5        }
   6    });
   7   
  8   Ext.define('Workable' , {
   9       work:  function   () {
  10           console.log( this .getName() + '-work' );
  11        }
  12    });
  13   
 14   Ext.define('User' , {
  15        mixins: {
  16           'enjoyable': 'Enjoyable' ,
  17           'workable': 'Workable'
 18        },
  19       config: { name: 'unknow'  },
  20   
 21       constructor:  function   () {
  22            var  me =  this  ;
  23   
 24            me.initConfig(arguments);
  25        },
  26   
 27       eat:  function   () {
  28            for  ( var  i = 0; i < arguments.length; i++ ) {
  29                console.log(arguments[i]);
  30            }
  31        }
  32    });
  33   
 34    var  user = Ext.create('User' );
  35   
 36   user.setName('段光伟' );
  37   
 38    user.play();
  39   user.work();

示例(C#扩展方法)

  1   using   System;
   2    using   System.Collections.Generic;
   3    using   System.Linq;
   4    using   System.Text;
   5    using   System.Threading.Tasks;
   6   
  7    namespace   MixinDemo
   8    {
   9        public   class   User
  10        {
  11            public   string  Name {  get ;  set  ; }
  12        }
  13   
 14        public   static   class   Enjoyable
  15        {
  16            public   static   void  Play( this   User user)
  17            {
  18               Console.WriteLine(user.Name +  "  -play  "  );
  19            }
  20        }
  21   
 22        public   static   class   Workable
  23        {
  24            public   static   void  Work( this   User user)
  25            {
  26               Console.WriteLine(user.Name +  "  -work  "  );
  27            }
  28        }
  29   }

示例(C#动态代理)

   1   using   System;
    2    using   System.Collections.Generic;
    3    using   System.Linq;
    4    using   System.Text;
    5    using   System.Threading.Tasks;
    6   
   7    using   Castle.DynamicProxy;
    8    using   Castle.DynamicProxy.Generators;
    9   
  10    namespace   MixinStudy
   11    {
   12        class   Program
   13        {
   14            static   void  Main( string  [] args)
   15            {
   16                var  proxy = Factory.Create<User> ();
   17               proxy.Id =  Guid.NewGuid();
   18               proxy.Name =  "  段光伟  "  ;
   19   
  20               (proxy  as   ITeacher).Teach();
   21               (proxy  as   IFather).Play();
   22            }
   23        }
   24   
  25       [Mixin( typeof  (Teacher))]
   26       [Mixin( typeof  (Father))]
   27        public   class   User
   28        {
   29            public   virtual  Guid Id {  get ;  set  ; }
   30            public   virtual   string  Name {  get ;  set  ; }
   31        }
   32   
  33        public   interface   ITeacher
   34        {
   35           User User {  get ;  set  ; }
   36   
  37            void   Teach();
   38        }
   39   
  40        public   class   Teacher : ITeacher
   41        {
   42            [MixinTarget]
   43            public  User User {  get ;  set  ; }
   44   
  45            public   void   Teach()
   46            {
   47               Console.WriteLine( "  我教你读书吧:  "  +  this  .User.Name);
   48            }
   49        }
   50   
  51        public   interface   IFather
   52        {
   53           User User {  get ;  set  ; }
   54   
  55            void   Play();
   56        }
   57   
  58        public   class   Father : IFather
   59        {
   60            [MixinTarget]
   61            public  User User {  get ;  set  ; }
   62   
  63            public   void   Play()
   64            {
   65               Console.WriteLine( "  我陪你玩吧:  "  +  this  .User.Name);
   66            }
   67        }
   68   
  69        public   static   class   Factory
   70        {
   71            public   static  T Create<T>( params   object  [] args)
   72                where  T :  class 
  73            {
   74                var  generator =  new   ProxyGenerator();
   75   
  76                var  options =  new   ProxyGenerationOptions();
   77   
  78                foreach  (MixinAttribute attribute  in   typeof (User).GetCustomAttributes( true  ))
   79                {
   80                    var  mixin =  Activator.CreateInstance(attribute.MixinType);
   81   
  82                    options.AddMixinInstance(mixin);
   83                }
   84   
  85                var  target = Activator.CreateInstance( typeof (T), args)  as   T;
   86   
  87                var  proxy =  generator.CreateClassProxyWithTarget(target, options);
   88   
  89                foreach  ( var  mixin  in   options.MixinsAsArray())
   90                {
   91                    foreach  ( var  property  in   mixin.GetType().GetProperties())
   92                    {
   93                        if  (property.GetCustomAttributes( typeof (MixinTargetAttribute),  true  ).Any())
   94                        {
   95                            property.SetValue(mixin, target);
   96                        }
   97                    }
   98                }
   99   
 100                return   proxy;
  101            }
  102        }
  103   
 104       [AttributeUsage(AttributeTargets.Class, AllowMultiple =  true  )]
  105        public   class   MixinAttribute : Attribute
  106        {
  107            public   MixinAttribute(Type mixinType)
  108            {
  109                this .MixinType =  mixinType;
  110            }
  111   
 112            public  Type MixinType {  get ;  set  ; }
  113        }
  114   
 115        public   class   MixinTargetAttribute : Attribute
  116        {
  117        }
  118   }

示例(C++)

?

class   Enjoyable

  {

  public :

      Enjoyable( void );

      ~Enjoyable( void );

      void   Play();

      virtual   string GetName() = 0;

  };

   

  class   Workable

  {

  public :

      Workable( void );

      ~Workable( void );

      void   Work();

      virtual   string GetName() = 0;

  };

   

  class   User: public   Enjoyable, public   Workable

  {

  public :

      User( void );

      ~User( void );

   

  private :

      string name;

   

  public :

      string GetName();

      void   SetName(string name);

  };

   

  User::User( void )

  {

  }

   

  User::~User( void )

  {

  }

   

  string User::GetName()

  {

      return   this ->name;

  }

   

  void   User::SetName(string name)

  {

      this ->name = name;

  }

   

  void   Enjoyable::Play(){

      cout << ( this ->GetName() + "play" );

  }

   

  void   Workable::Work(){

      cout << ( this ->GetName() + "work" );

  }

示例(Ruby)

  1   module Enjoyable
   2        def   play
   3           puts(self.name +  "  -play  "  )
   4        end
   5    end
   6   
  7    module Workable
   8        def   work
   9           puts(self.name +  "  -work  "  )
  10        end
  11    end
  12   
 13    class   User
  14        include Enjoyable, Workable
  15   
 16        attr_accessor :name
  17    end
  18   
 19   user =  User.new
  20   user.name =  "  段光伟  " 
 21    user.play
  22   user.work

 代码示例(Java的Qi4j)

示例地址: http://qi4j.org/latest/two-minutes-intro.html

 代码示例(Python)

user.py

?

class   User():

         def   __init__( self ):

                 self .name =   "unkwnow"

 

         from   Enjoyable import   play

         from   Workable import   work

 

         def   getName( self ):

                 return   self .name

 

         def   setName( self , name):

                 self .name =   name

 

user =   User()

user.setName( "段光伟" )

user.play()

user.work()

         

Enjoyable.py

?

def   play( self ):

     print ( self .name +   "-play" )

Workable.py

?

def   work( self ):

     print ( self .name +   "-work" )

备注

在学习一门语言的时候,如何模拟Mixin是我必须思考的一个东西。

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于技术改进方案模板的详细内容...

  阅读:40次