代码改变世界

部门培训阶段考试题目,你会几道?

2009-04-04 18:53  ilclr  阅读(388)  评论(4编辑  收藏  举报

来新公司上班已经快100天了,整个团队的情况比较初级,代码编写方式完全采取堆砌式,过程控制基本没有。所以基于此现状,也为了尽快能以科学的方式对团队进行过程控制,辅助一些控制办法,遂决定对部门进行一个周期性的培训,首选的是Design Pattern技术。通过整个03月份每周五下午的四次培训

(具体内容如下:

第一周:面向过程开发
           基于对象开发
           面向对象开发
           模式化的面相对象开发 四种开发方式的概念、利弊以及比较
           简单工厂模式简介

第二周:简单工厂模式类组成
           类间、类与接口间常见关系:关联、聚合、合成、依赖、泛化、继承、实现

第三周:策略模式介绍

第四周:Design Pattern技术实现的两个通用步骤:增加代理与响应分层
           模式技术交流)

并辅助日常开发过程中细节功能实现的模式化交流,在03月底最后两天进行了一次开卷考试。题目内容如下,有兴趣的朋友可以测试一下自己对Design Pattern技术了解的透彻程度----Design Pattern是一种习惯性思维方式,不要被GOF的23个模式类目拘束,否则不会用好。:)

 

 

软件研发部内部培训测试题

----------------------------------------------------------------------------------------------------------------------

 

    __________________________

 

交卷时间 _______________ : ____

 

交卷时间 _______________ : ____

 

注:请于20090331日下午1700之前交卷,过期计为0

 

----------------------------------------------------------------------------------------------------------------------

题目说明:

 

1、 811分,合计21

2、 912分,漏选1项扣3分,错选10

3、 1015分,漏选1项扣6分,错选10

4、 1120分,110

5、 1232分,漏查1项扣9分,错查10

6、附加题部分可选答,答题结果不计入测试结果

 

----------------------------------------------------------------------------------------------------------------------

 

 

1、系统中普遍存在的是____________________,如果__________直接发送消息到__________,则__________很高。为了降低耦合,需要在____________________之间增加__________

 

 

2、设计模式的三种分类分别是__________模式、__________模式和__________模式。

 

 

3、策略模式属于__________模式,此模式对应对象生命周期的__________阶段。

 

 

4、面向对象语言中可以通过__________类的引用指向__________类的对象。

 

   A、父    B、内部    C、子    D、抽象

 

 

5、设计模式中的代理层操作的对象为__________对象

 

   A、私有  B、全局    C、抽象  D、静态

 

 

6、简单工厂模式的类组成包括(不考虑请求层):__________类、__________类和__________类。

 

 

7、策略模式中,我们在策略类中使用__________类的对象,并在请求层中通过传递具体算法类的对象来达到多态的目的。

 

 

8、工厂方法中的参数在设计模式中有特定的名称,此名称为__________

 

 

9、下面的话中,哪些话填到后面的括号中是正确的----设计模式____________________

 

   A、减少了对既有代码的直接改动

   B、降低了服务对请求响应的耦合度

   C、保护了原有代码

   D、通过请求包装了响应

   E、实现了晚绑定

   F、代理了响应并实现了多态

   G、响应分层来实现了对扩展的开放

 

 

10、下面的叙述不正确的是:设计模式中,____________________

 

    A、代理可以彻底解耦,让耦合消失

    B、响应必须分层

    C、响应分层后可以实现功能的分离

    D、代理封装的是请求

    E、代理中通过包装子类指针实现对变化点的封装

 

 

11、代码填空:请填写下面代码中的两个空白处。

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace SimpleFactory

{

    class Program

    {

        static void Main(string[] args)

        {

            Request();

        }

 

        private static void Request()

        {

            SimpleFactory simpleFactory = new SimpleFactory();

            Console.Write("请输入要生产的产品订单号:");

            try

            {

                int orderForm = int.Parse(Console.ReadLine());

                _______________ abstractProduction = simpleFactory.Product(orderForm);

                if (abstractProduction != null)

                {

                    abstractProduction.ShowInformation();

                }

                else

                {

                    Console.WriteLine("非常抱歉,我们的工厂当前无法生产您要求的产品.....");

                }

            }

            catch

            {

                Console.WriteLine("订单格式错误。正确的订单格式应为阿拉伯数字");

            }

            Console.WriteLine();

            Request();

        }

    }

 

    abstract class AbstractProduction

    {

        public abstract void ShowInformation();

    }

 

    class ConcreteProductionA : AbstractProduction

    {

        public override void ShowInformation()

        {

            Console.WriteLine("您要求的产品A已生产,请付款取货");

        }

    }

 

    class ConcreteProductionB : AbstractProduction

    {

        public override void ShowInformation()

        {

            Console.WriteLine("您要求的产品B已生产,请付款取货");

        }

    }

 

    class ConcreteProductionC : AbstractProduction

    {

        public override void ShowInformation()

        {

            Console.WriteLine("您要求的产品C已生产,请付款取货");

        }

    }

 

    class SimpleFactory

    {

        public _______________ Product(int orderForm)

        {

            switch (orderForm)

            {

                case 1:

                    {

                        return new ConcreteProductionA();

                        break;

                    }

                case 2:

                    {

                        return new ConcreteProductionB();

                        break;

                    }

                case 3:

                    {

                        return new ConcreteProductionC();

                        break;

                    }

                default:

                    {

                        return null;

                        break;

                    }

            }

        }

    }

}

 

 

12、代码查错:请在你认为存在错误的代码行前标准“√”和错误序号,并按照自定义错误序号填写错误原因表格。

 

    注:下面的代码中错误数量不超过5处。

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace StrategyPattern

{

    class Program

    {

        static void Main(string[] args)

        {

            CallArithmetic(ReceiveExecuteArithmeticInfo());

        }

 

        private static int ReceiveExecuteArithmeticInfo()

        {

            Console.WriteLine("-------------------------请输入您希望执行的算法编号-------------------------");

            Console.WriteLine();

            Console.WriteLine("说明:算法A编号为1,算法B编号为2,算法C编号为3");

            Console.WriteLine();

            Console.Write("当前要执行算法编号为:");

            try

            {

                return int.Parse(Console.ReadLine().Trim());

            }

            catch (Exception e)

            {

                return -1;

            }

        }

 

        private static void CallArithmetic(int arithmeticCode)

        {

            Strategy strategy = new Strategy();

            switch (arithmeticCode)

            {

                case -1:

                    {

                        Console.WriteLine();

                        Console.WriteLine("算法编号内容格式错误,请重新输入正确的算法编号");

                        Console.WriteLine();

                        break;

                    }

                case 1:

                    {

                        strategy.DoSomeArithmetic;

                        break;

                    }

                case 2:

                    {

                        strategy.DoSomeArithmetic;

                        break;

                    }

                case 3:

                    {

                        strategy.DoSomeArithmetic;

                        break;

                    }

                default:

                    {

                        Console.WriteLine();

                        Console.WriteLine("算法编号内容不存在,请重新输入正确的算法编号");

                        Console.WriteLine();

                        break;

                    }

            }

            //重复执行

            CallArithmetic(ReceiveExecuteArithmeticInfo());

        }

    }

 

    class Strategy

    {

        private AbstractArithmetic abstractArithmetic;

 

        public void DoSomeArithmetic

        {

            abstractArithmetic.SomeArithmetic(); 

        }

    }

 

    abstract class AbstractArithmetic

    {

        abstract public void SomeArithmetic()

        {

            //do nothing

        }

    }

 

    class ConcreteArithmeticA : AbstractArithmetic

    {

        override public void SomeArithmetic()

        {

            Console.WriteLine();

            Console.Write("具体算法A正在执行 ");

            Console.WriteLine();

        }

    }

 

    class ConcreteArithmeticB : AbstractArithmetic

    {

        override public void SomeArithmetic()

        {

            Console.WriteLine();

            Console.Write("具体算法B正在执行 ");

            Console.WriteLine();

        }

    }

 

    class ConcreteArithmeticC : AbstractArithmetic

    {

        override public void SomeArithmetic()

        {

            Console.WriteLine();

            Console.Write("具体算法C正在执行 ");

            Console.WriteLine();

        }

    }

 

}

 

错误原因:

 

错误序号

错误原因

 

 

 

 

 

 

 

 

 

 

 

 

------------------------------------------------ ------------------------------------------------

 

 

13、依赖关系与聚合关系最主要的区别是关系中涉及的两个类的____________________不同。

 

 

14、类与类之间的关系包括:____________________________________________________________________________________________________,类和接口之间的关系包括____________________

 

 

15、下面的叙述中正确的是:________________________________________

 

A、继承本身可能会违反里氏替换原则(LSP

B、 使用继承扩展功能的同时可能会造成不必要的功能扩展

C、 使用继承扩展功能的方式违背开闭原则(OCP

D、继承本身会破坏封装特性

E、 接口不支持复用

F、 父类指针指向子类指针,也即向上引用的机制即是多态的本质

 

 

16GOF23个设计模式实现过程中的两大步骤分别是:

第一步:____________________________________________________________

第二步:____________________________________________________________

其中,第一步的主要目的是________________________________________,第二步的主要目的是________________________________________

 

 

17、从严格意义上讲,简单工厂模式违背了面向对象(OO)设计原则中的____________________原则。

 

 

18、设计模式中,响应的分层策略有很多种,其中最常见的就是继承方式分层,但此方式的缺点也是显而易见的,请说出你想到的任何缺点。

 

答:

 

 

 

 

 

 

 

 

 

 

19、(场景题)假设现在需要制作一个功能,功能内容为:从本地硬盘文件目录中读取一个视频文件的内容到内存,并将此文件内容通过TCP协议方式传输到远端指定IP地址。无论任何形式的内存数据流通过TCP协议进行传输的时候,传输机制都是完全相同的,并假设此场景中不考虑远端序列化。请写出当你碰到此需求的时候,所进行的类设计----仅写出要实现上述功能你需要定义哪些类,以及这些类中包含的关键方法。

 

答:

 

 

 

 

 

 

 

 

 

 

20、简单阐述为什么在继承的时候会出现里氏替换原则(LSP)描述的情景。

 

答:

 

 

 

 

 

 

----------------------------------------------------------------------------------------------------------------------

 

对于完全掌握模式思想精髓的朋友,可以游刃于代码实现中的朋友可以不屑以待之。