技术改进方案模板
技术改进方案模板
来自: 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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息