标签归档:C#

Advanced Training总结

整个的Advanced Training持续时间一个月。任务是做一个类似于JUDE一样的UML辅助建模工具,工具要基于.NET开发者。因为公司Securtiy policy,所以这里不太方便透漏技术细节,只能记录自己的心得体会。

团队方面,起先是3个人,后来成为4个。Leader一个,我不是Leader。

技术方面,起先开始用户需求分析。我将我分析的部分有哪些模块,模块里面涉及到哪些细节通通写在笔记本上。后来看来这非常浪费时间不说,而且根本就没有看什么。最好的办法就是不管写什么就写到计算机上,特别是事前估计 effort 比较大的要写的东西,写到计算机上面一来打字比较快,二来将来文档化的时候很多东西可以复制粘贴。

团队整体将项目分成两块:数据和UI。 Leader问我们的兴趣点愿意搞哪一块,因为我当时对winform UI 以及 GDI+ 一窍不通,而对数据面向对象建模有点信心,于是我就负责了数据。而Leader就负责了UI及控件。于是我就借用JUDE工具绘制我对项目的类图,就是至少这张类图,我对着他看了3个星期。到了后来coding的时候都有些想吐的感觉,因为我的工作没有一个UI,全是代码。这里有两个场景我印象很深。

第一个场景是关于在团队中要坚持自己的观点。起先是类图设计的过程中,我一开始认定一种类型的连线用一个类,线的基类用一个类,放线的公共属性。而一个member建议用一个字段来表示不同的线类型。Leader先是同意我的观点,然后后期可能因为他UI方面要求我用一个字段,于是我妥协。按这样的设计后,有一天我突然觉得越想越难实现,于是第二天,大概是项目中期的样子,我又去改底层架构,改良了之后的架构不管从扩展性以及健壮性都比以前强得多。这里有两点启示:1. 如果你认为你的观点是正确的,哪怕团队其他成员都反对,你一定要找出事实证据后坚持你的观点,不要轻易妥协。团队需要和谐,团队更需要有想法的人。2. 不管你处于团队哪个位置(Leader更是如此),要考虑自己的部分会对其他人造成什么影响,如果只有自己的爽,将其他人的工作搞得无比郁闷,那你自己到后期依然爽不起来。

第二个场景是关于保持信心的坚持自己的工作。在办公室里面跟其他的团队坐在一起,经常其他的团队做UI的做了一个Demo出来,然后大家都围上去看,羡慕的不得了。这一来表面一个技术点被攻下,二来表面项目进度又进了一步。如果旁边的团队经常这样欢呼,而自己面对同样的类图工作了3个星期,信心是有点影响的。一来不知道自己团队的这些技术点攻破没有,二来别人接触到了新东西而自己没有(以为自己没有成长)。不过后来的事实表面,这一套底层架构设计的非常成功的,任何的操作都变得非常简单,只是在写API details的时候自己想吐。

总的来说,在群硕工作就会经常完成一些看似不可能完成的任务,我们都没有想到一个月的时间能够做出来一个像模像样的基于.NET的UML制图工具。是为记。

学习 C# ing

昨天又送走了两位同学。一个B晨,我班最后的新疆伢;一个大熊,我们班男生成绩最好的人。B晨是回老家,大熊是上班。

武汉仿佛只剩下我们几个了。没想到,真没想到,大家毕业后大部分都离开武汉了。

对自己说,该奋斗了,再玩就要出人命了。

今天练习C#,对着书做一个个Demo,然后静下心来看MSDN。发现其实MSDN真的很好,今天已经学会怎么从MSDN里面快速找到我要的资料了。说起来惭愧啊,拿到毕业证后才开始看MSDN。不知道即将面临的同事们有多么的强大,自己能否尽快的在公司立足以不至于被淘汰。

哦,还记得昨天看了篇据说毕业生推荐观看TOP 1 的《The persuit of Happyness》,Will Smith 主演,讲述了高中毕业的主角怎么从一个销售成长为20录1的stockbroker。又是一部激励人的片子。看完了片子之后,我把QQ签名改了。

对自己说,该奋斗了,再玩就要出人命了。

P.S.:
1.张小盒的搜狗皮肤很不错。
2.很羡慕《奋斗》电视剧里面的生活,虽然知道很假。^^

Some Final Object Concepts—对象概念末论

一个重要的概念“多态(polymorphism)”
在《韦氏大词典》中定义“可以呈现不同形式的能力或状态”。
说简单点,就是同样一条消息(语句调用),响应消息的方法代码因为对象的不同而不同。
举个例子:

一次学校组织活动“师生联谊”,那么有教授 Professor 参加,也有学生 Student 参加。那么活动负责人(Web App.)就要把参加者的名单统计出来,结果统计成一个数组 Person[] 。意思就是只要参加活动的教授或学生都将其放入这个数组。

那么活动开始有个环节叫自我介绍 SelfIntro() ,不同的人自我介绍的内容不一样。教授介绍自己的毕业学校,现在所属的学院,自己所教授的课程等等。而学生介绍自己的学院,系别,专业,兴趣等等。学生和教授自我介绍的内容不一样。

那么活动开始了,主持人只要说一句话: Person[i].SelfIntro(); 就可以让每个人依次进行自我介绍。轮到教授的时候他知道该说他的内容,轮到学生的时候也知道该说学生的内容。但主持人只对他们说了同样的一句话,就可以达到这种效果。

这就是多态。

那么我们延伸程序里面,肯定之前主持人将教授和学生从 0 开始编号,然后自己建个 for 循环,控制 i 变量计数。
还有就是在 Person 类里面一定有个 SelfIntro() 方法。可以是虚方法,也可以是抽象方法。如果是虚方法,一定内容是介绍自己的姓名年龄等等这些教授或学生都会介绍的公共属性;如果是抽象方法,就不用写任何内容,只要一个 abstract 加在前面等后面的子类覆载就行了。

所以由上面的例子看得出来,多态是建立在继承和覆载基础之上的。

抽象(Abstract Class)
抽象类列举一个类所需要的行为,但不明确提供每个行为的具体实现方法。而那些只给出方法头,却没有编写相应的方法体的方法叫抽象方法(abstract method)


含有抽象方法的类就叫做抽象类,那么在声明的时候必须加上 abstract 。否则会报错。
抽象类是不能够实体化的,因为有的方法只有方法头,没有方法体。所以我们必须 override 那些 abstract 的方法,才能使子类能够顺利实体化。如果在继承后依然有抽象方法没有被覆载的话,那么子类前面也应该加上 abstract ,而且同理不能被实体化。

接口(Interface)


接口ITeacher里面的方法都是默认的 public abstract 。所以不用再为其加上这2个关键字,否则编译器会报错。

抽象类基本就是有抽象方法也有一般方法,而接口只有抽象方法。所以两者有一定的联系。

接口说白了就是某种类型的描述,如果你继承了接口,你也同时可以看做可以做“接口的事”,比如上面的意思是 Professor 也是老师。

如果有两个或者多个类同时继承了某接口,那么我用某接口申明的变量对这两类同时适用。


类可以同时继承其他类和接口,但是只能继承一个其他类而且只能放在继承列表的第一个,后面的跟接口。

静态特征(Static Feature)
举个例子:

所以依据这个原理,出来很多用具类(Utility Class)比如 Math.Sqrt(i) 。。

常量,就是第一次给点初始值之后就不会变化的量。


主要内容就这些了。

Collections of Objects–对象群集

思考过一个问题,比如在SRS系统中,要查询毕业需要选修的科目的时候,那么方法应该怎么写?返回值将不再是一个对象,而是一群对象。因为科目有很多,每个就是一个course对象。由这个问题联想到C#里面也有一种数据结构–“将对象放在一起”。 想象一个鸡蛋卡板,卡板就是对象群集,鸡蛋就是一个一个对象。那么卡板其实也是一个对象,所以先将卡板初始化。然后试图将一个鸡蛋放入卡板中。


不过值得注意的是,对象其实并不在群集里面,放在群集里面的是对象引用。也就是说对象本身不在里面,因为对象可能会因结构不同而很大,而对象引用则是C#编译器里面规定的那么大小。 初始化一个数组


和C语言一样,访问其中的元素还是以0开头的标号。
赋初值的方法 2种

如果不赋初值,那么数组中的元素将自动初始化为该种数据类型中与0相当的值。可以借助循环初始化数组。遍历数组做事情。


数组一旦被声明,尺寸不能改变,而且只能插入与声明数组时指定的数据类型。数组分为矩形数组和锯齿形数组



有序列表–估计就相当于C里面的链表 C#里面 ArrayList 分类有序列表–C#里面的 SortedList 集合–不分顺序的放在一堆字典–当对象被存储时同时存储一个查询键方便查询。类似于中国电信BOSS里面查专线号可以出来线序、地址、联系方式的东东

Relationships Between Objects—-对象间关系

对象和对象间不但有互相交换消息的操作,而且对象间也有关系,就像人跟人一样,有的人形同陌路,有的人却亲如父子。

我们自然没有太多的时间去研究陌生人,但起码我们可以了解像亲如父子的关系,比如说:继承(inheritance)

在研究继承之前,我们先要了解一些概念
关联(Association)与链接(Link)

关联说白了就是两者关系的描述。

学生选课
教授讲课

但是跟“类”的定义类似,这种表象关系是大范围的,不具体到个别的。
但是链接就是具体到个别的,也可以说是关联的实例。
张三选修PHP
李四选修ASP.NET

诸如此

结对关系(Multiplicity)
简单的说就是描述关联的数目:一对一,一对多,多对多

不过,关联可以根据结对关系而改变数目,链接只可能是两个对象间存在。

聚合(Aggregation)
一种特殊的关联,从描述的语句中经常出现“包括”“由……构成”或“有……”

下面是重点:继承
比如我们写一个Student类
写完后,我们要再加一个研究生类,但是GraduateStudent类其他的跟Student一样,只是多加了个本科学位以及本科学校两个attribute以及对应的property。
那么问题来了,我们写这个GraduateStudent类的时候怎么写呢?Ctrl+C(V)原来的Student类??太麻烦,而且要改起来的话,又会连锁反应。

直接继承


覆载和多载
覆载就是override 用以替代基类中的虚方法
多载也叫重载,就是同样的方法名但是参数签名不同,所以调用方法的时候可以根据不同的参数形式来让程序自动选择适合的方法。

下面将学到群集。

Object Interactions–对象互操作(下)

方法签名:用来指代方法头中可被调用代码所“发现”的方面。简而言之,就是不包括 参数名 和 返回类型 的方法头。

比如:


Delegation 委托
如果对象A为了满足某个请求,而寻求另一对象B的帮助,就被称作A对B的委托。
简单说,如果A调用B的方法,那么就是A 委托 B做件事情。

那么如果引起对象A执行一个方法的代码,称作对象A的客户代码。
就是说,哪里调用对象A的方法,哪段代码其中包括对对象A方法的调用,那么这段代码就叫对象A的客户代码。

信息隐藏:就是只提供服务或者方法头,但是不告诉客户代码执行这些服务的内部细节。

可访问性(Accessibility)
C#提供的五种关键字:public , private ,protected , internal , protected internal
在声明特征时没有明确指定其可访问性,则会拥有默认值 private .

在类方法中访问本类的特征只要引用其名称即可。

Pascal命名法 增加一个公共attribute的名称。

那么从客户代码怎么去访问私有attribute呢?
有两种方法:取值/赋值,property
eg:


我们有3种例外不对attribute提供公共方法。
1 。attribute 只进行内部整理工作所用。

2. 有些方法也只用于内部工作。比如 private void DoSth(){…}可能会改变关键值,而这个方法只能被该类下其他方法调用,不能存在于客户代码中。

3. 不是每个私有 attribute 同时提供取值器和赋值器。
不如你要提供一个attribute为只读。那么只用提供get取值访问器。而不给客户代码set的机会。

在软件工程维护中,尽量只改变方法内部的细节私有部分,而不改变方法头,这样可以有效避免连锁反应。因为要知道一个应用程序可能成千上万的地方引用方法头。如果你改变类里面的数据结构即方法头的话,那么你在维护的时候就够受了。

通过编写自己的构造器可以对类进行方便为类设定默认值。

Objects and Classes–对象和类

在前一章节,我们了解到了抽象是用来创建一个真实世界的模型。而在这个庞大的模型体型中(也许不庞大),里面的组成元素就是对象。在现实世界里面,有很多对象,分为物理的和概念的。物理的是什么,学生,教室,课桌,图书馆;而概念的呢,课程,院系,学生会。这些统称为对象。那么正式点的软件对象是什么呢?

软件对象,是一种将状态(数据)和行为(操作)合成到一起的软件构造,用来描述真实世界的一个(物理或概念性的)对象。

状态(State)/Attribute/数据(Data)
For example:记录一个学生的信息,需要以下数据:学生姓名,学号,生日,住址,主要研究方向,累积积点,导师是谁,本学期要修的课程,已经修过的课程,获得的学分,课程分数。
那么记录一个课程的信息:课程编号,课程名称,先修课程,有效学时,最多人数,带队教授。

那么其中的每一项就称为Attribute属性。因为容易与所以.NET里面的一直特殊的编程构造attribute搞混。所以在.NET里面经常用field来代表属性Attribute.

行为(Behavior)/操作(Operation)/方法(Method)
For example:
学生 和 课程 都有各自的行为
比如学生 : 选修一门课程;推选一门课程,选修主修方向,选修导师,显示自己的GPA,显示自己已经选了哪些课,哪位老师上的课,以及得到的分数。

而课程也有自己的行为
比如允许学生选修,判断指定学生是否已经选修,告诉你已经有多少人选修,告诉你先选修什么,告诉你哪位教授带这节课……


我们把对象的行为或称操作,定义为用以访问对象的attribute和修改/维护attribute值的方法。

我们可以看到:每种操作都与学生一个或多个attribute有关。

类(Class)
类描述了一组相似对象的共同特性。
类定义了以下要素:
1. 定义了对象所需要的数据结构(attribute 的名称和类型)
2. 这些对象要执行的操作,尤其死哪些操作,描述“方法(Method)”是如何在后台执行这些操作的。 HOW?

实际上一个类定义中能找到的东西,要么是类的attribute,要么是该类的方法。

Pascal 命名法 :每个单词第一个字母用大写,所有单词直接连接。用与: 类名 方法名
eg: CourseCatalog RegisterForCourse
Camel 命名法: 第一个单词以小写字母开头,后面跟随的每个单词以大写字母开头。用于: 变量名 attribute
eg: studentId courseLoad

类就相当于对象的模版,对象就是类的一个实例。类里面定义了有哪些attribute和方法,而对象里面的每个attribute值都已经给出,方法可以调用。

如何将对象实例化:
比如有个Student类
那么下面创建一个Student的对象。

程序代码 程序代码
Student y = new Student();

那么其中的y称为 引用变量。相当于指针 ,用于指向内存中实际存在的对象,并且可以展开操作。
引用变量也可以像指针那样互相传递操作,不再赘述。

最后一点是,作为一个对象的attribute的值也可以是对象。变量类型为所要引用的对象的所属类名。
这样有个好处,只要保证很多对象中的attribute的引用变量一样,那么“一改全改”,不用“处处改”。

今天只学习了用户的自定义类型。
下面还会学习 继承 和多态

Abstraction and Modeling–抽象与建模

这个世界有很多信息,除去所有电子信息外,比如E-mail,语音邮件等,在生活中我们获得的信息如果量化,那将是我们的感觉器官每时每刻接受周围的数以百万计的信息。而我们的大脑负荷有限,所以我们大脑天生就懂得简化收到的信息,即“抽象”Abstraction

具体什么是抽象?即,识别和关注状况或物体的重要特性,淘汰掉所有非本质信息。

For example: 游览路线图(地图类),里面只标明了必要的道路,河流,山脉以及森林等等,而没有标明每一棵树,每一个房子长什么模样,每个路边广告牌写什么字,这叫抽象。因为人们看图只为了知道方向和具体方位,而路边的风景等其他的东西他现在不需要知道,要知道也是沿途去欣赏,而不是在这里看路线图。所以路线图把这些细节或者属性和内容都“淘汰”掉了,只留下此时此刻最重要的部分。

通过抽象来概况特征。
如果从一个抽象模型中剔除足够多的细节,那么它将变得足够通用,足以适应于多种情况或场合。
For example:高中生物经常讲细胞,但是老师最初讲的时候,没有人会说黑板上面的那个细胞就是我们体内的细胞。因为黑板上的那个细胞只是个抽象,只画出了“身体各种各样的细胞所共有的部分”,什么细胞核,细胞膜。而且形象也单一,但是足以可以用于教学。而具体到什么血红细胞的时候,就是对这个抽象类进行实例化,到时候细胞的外形,里面的功能器会多多少少的不一样。

人们习惯对信息进行分类处理。而难点在于怎么去分类。
For example:我要定义“鸟”。有4个条件:1 有羽毛 2 有翅膀 3 产卵 4 会飞
如果这4个条件加上来,我们会发现鸵鸟和企鹅将会被定义为”Non-Birds”,因为他们不会飞。
但是他们确实又是鸟。所以我们去掉条件4,保留条件1 2 3
我们又会发现,条件3其实是多余。因为要不要条件3都不会影响“鸟”类的是非判断。所以可以简化成:
1.有羽毛 2 有翅膀
如果再简化。假设去掉条件1结果是什么情况?那么那些蝴蝶,飞机什么的都属于“鸟”类。
……
所以我们需要定义合适的规则集不过于普遍,也不过于严格,而且没有冗余。

抽象的重用—–不是每接个项目就要重新来过,可以“借鉴”以前的项目抽象模型。

UML(Unified Modeling Language)统一建模语言,用图形标记作为沟通语言。经常是建模之后用UML语言进行表达,然后再针对UML语言进行编码。

A Little Taste Of C#–初尝C#

先从一个最简单的C#应用程序开始:


C#的注释
//这是经常使用的单行注释符号
//如果是多行也经常这样使用
还有2种 :
/*这是沿用C里面的注释符号*/
/*这是多行的注释
这样可以暂时屏蔽一些代码
比如:
a=b+c;
c=a*d;
*/

数据类型:C#支持各种简单类型
bool:布尔值 true or false
char: 16-bit Unicode 字符
整形: byte short int long 分别对应 8-bit 16-bit 32-bit 64-bit
浮点型:float double 分别对应 32-bit 和64-bit

有一个蛮经典的经验:(看代码)


变量命名的约定
Camel命名法:首字符小写,后续的每个词首字符大写,而其他字符小写。
eg: averageGrade
myPetRat
weAreFriends

字符串(string)
1.引用类型
2.用 + 连接 eg:

隐式类型转换和显式类型转换
原则是: 不能损失精度
eg: 把一个浮点型赋值给整形变量会编译出错,理由是会发生精度损失,而这在C或C++里面是允许的。
这叫 窄化转换(narrowing conversion)
而宽化转换(widening conversion)是允许的,比如将x=2赋值给y,那么y=2.0

C#(和C,C++,JAVA一样)是种 块结构语言(block structured language),代码块即用{…}包括起来的代码
而变量的作用范围(scope) 只在变量被声明的代码块中,变量才“在界内(in scope)”.
eg:

输出到屏幕分2种 当然之后还会学图形界面

外国人的思想和国人不一样,国人注重语法,外国人更加注重编程习惯。
这本书花了整整4小节在第一大节里面介绍了良好的C#编程习惯
从代码缩进,到怎么聪明的使用注释,再到括号的放置,再到自说明的变量名,给了我很深的印象。就像早就听说的外国的驾校着重告诉人们应该具备怎样的开车礼仪和开车习惯,而开车技术则被放在次之的地位。

总结就到这了,如果说收获,我想要是读E文的收获会更大。现在想将来要收获面向对象OO的思想,以及外国人的先进思考方法。

Beginning C# Objects

这本书非常不错,从介绍面向对象(Object oriented,简称OO)的概念开始,然后结合C#的代码实例做论证。深入浅出的告诉了读者什么叫对象,怎么用对象写程序。然后从对象的概念引导读者建模。最后结合自己所学的知识写一个SRS(Student Registration System).

这本书由CSDN技术总监韩磊翻译,而且在他的《C#,你真的入门了吗?》里面深入浅出的道出了一个事实,国内有很多面向对象程序员根本就不知道OO的原理,只知道用IDE工具进行拖放,而国内的很多.NET的书籍一开始也是交你怎么拖放。的确,拖放IDE工具栏的组件可以让你快速入门,但是整个OOP的思维你并没有掌握。而这本书便是从OO的思维以及程序的核心运作的角度来带你进入OOP的世界。

我会什么?在学C#前,我学过或者说接触过:C,VB,JAVA,VBScript,ActionScript 2.0,VHDL, PHP ……学过的语言很多,唯有JAVA是面向对象,其他都是面向过程的。而我在JAVA考试中也尽可能的用对象的思维去解题。但是对象的概念是什么,究竟在项目中怎么使用对象,在编程前的建模是怎么用对象,这些我还不曾知道。

所以借这个学习C#和.NET的机会,我可以真正了解面向对象的编程思想。从而真正进入面向对象OOP的世界。

这将是个连载,下一节,我就要先探讨C#的基本语法和一些很基础的东西。敬请期待 < 初尝C# >