zoukankan      html  css  js  c++  java
  • 技术改进方案模板

    技术改进方案模板

    来自: http://www.cnblogs.com/raol/archive/2013/04/25/program_template.html

    关于XX改进方案

     

    现状描述:

    不满意的地方

    1.

    2. 

    技术改进点:

      1.

      2

      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++)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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

    1
    2
    def play(self):
        print(self.name + "-play")

    Workable.py

    1
    2
    def work(self):
        print(self.name + "-work")

    备注

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

  • 相关阅读:
    Java实现 洛谷 P1064 金明的预算方案
    (Java实现) 洛谷 P1605 迷宫
    (Java实现) 洛谷 P1031 均分纸牌
    Java实现 洛谷 P1060 开心的金明
    三代名将却三代悲剧(绝对不要轻易招惹“关系户”,要学会适应规则)
    simulate windows postmessage or keydown
    qt 拖拽 修改大小(使用了nativeEvent和winEvent)
    QT下资源使用和资源占用…(可以动态加载资源文件,这样不占内存)
    qt实现头像上传功能(写了4个类,朝十晚八的博客,非常好)
    自定义ModelValidatorProvider
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3041757.html
Copyright © 2011-2022 走看看