<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>note</title>
	<atom:link href="http://www.imasson.com/note/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.imasson.com/note</link>
	<description>Masson的笔记本</description>
	<lastBuildDate>Wed, 15 Feb 2012 16:18:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>《高效程序员的45个习惯》简要笔记(3) – 学无止境</title>
		<link>http://www.imasson.com/note/2012/02/practices-of-an-agile-develope-note-3/</link>
		<comments>http://www.imasson.com/note/2012/02/practices-of-an-agile-develope-note-3/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 16:18:05 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[敏捷开发]]></category>
		<category><![CDATA[软件开发者]]></category>

		<guid isPermaLink="false">http://www.imasson.com/note/?p=187</guid>
		<description><![CDATA[敏捷需要不断的学习和充电。在软件行业中，虽然有一些概念一直有用，但还有很多知识很快就会过时。在一个企业化的社会里面，只有一个人会为你负责，那就是你自己。是否能跟得上变化，完全取决于你。 习惯05：跟踪变化 唯有变化是永恒的。 历史证明了这句话，技术发展步伐如此快速，简直让人难以置信。以下的建议让你随时跟上技术变化的步伐： 迭代和增量式的学习：当你听到一些不熟悉的术语时，简要记录下俩，然后计划去了解或研究它。 了解最新行情：选择优秀的技术博客，经常去读一读，本书推荐参考：http://pragmaticprogrammer.com，of course in English。 参加本地的用户活动：听讲座，积极参与问答环节。是否有类似的TED活动？ 参加研讨会议：计算机大会，机会应该很难得 如饥似渴地阅读：包括开发、非技术书籍，也可以是一些学术期刊和商业杂志（怀念大学的图书馆…） 其他建议：只要你在某些方面成为了专家， 就能用类似的方法，很容易地在其他领域成为专家。不过在做决策前，要做好新技术的优势、劣势、成本等评估。开发一个小的原型系统是一种良好的尝试和学习方法。 习惯06：对团队投资 总是要成为你所在的整个乐队中最差的乐手。如果你是乐队中最好的乐手，就需要花从新选择乐队了。 一个学习型的团队才是较好的团队。你需要和其他团队成员分享所学的知识，把这些知识引入团队之中，并不断吸收来自其他成员的知识。 分享会：分享会是其中一种很好的办法。可以每周让其中一名成员主持讲座，但需要坚持有计划有规律地进行，而且不要局限于纯技术的图书和主题。 &#160; 习惯07：懂得丢弃 我们在设计程序的时候，往往会受到不少约束，比如内存的大小（虽然直到在Android和iOS时代仍然普遍存在），极大地影响了你的设计和编程技术。随着科技的进步，这些约束逐渐消失。电脑和CPU曾经非常昂贵，而现在它们就是日用品。现在，开发者的时间才是紧缺和昂贵的资源。 根深蒂固的习惯不可能轻易就丢弃。学习一门新的技术的时候，多问问自己，是否将太多旧的态度和做法应用在新技术上，这样将失去新技术期望得到的益处。但对于优秀的旧知识仍然可以举一反三地灵活运用，但切忌习惯性地落入旧习惯中。而且当我们使用新技术时，应尽可能投入完全转入新的推荐的开发环境中，这样有利于养成新的习惯，并提高效率。 对于所使用的编程语言，需要经常总结这种语言的特性，与其他语言比较有什么不同。 &#160; 习惯08：打破沙锅问到底 这个习惯是关于如何解决团队开发中出现的一些问题的。但这是为什么呀？ 解决一个问题需要知道许多可能的影响因素，正如一个医生要诊断病人必须先全面了解病人状况一样。当咨询问题的时候，让他们耐心地回答你的问题是他们的责任。 在理解一个问题的时候，需要渐次地问5个以上的“为什么”……好奇是很好的方式，进一步挖掘简单的答案，让设想更加接近事情的真相。——《第五项修炼》 当然了，在提问之前，想好你提问的理由，这样有助于你问出恰当的问题，提高效率。 &#160; 习惯09：把握开发节奏 许多不成功的项目都缺乏工作计划，而敏捷项目注重节奏和循环，这样令工作和管理都更加轻松。 例如Scrum约定了30天之内不应发生任何需求变化，确保团队的开关节奏，防止突然的工作量增大和重大需求变更。于是，我们必须更具远见，不同的日期保持不同的开发节奏，保证项目中的所有工作项有序执行，而且全部是可以计划和预知的。这样的方式也有助于自己严格管理时间。敏捷管理原则上是不让成员加班的，如果工作超出了预定的期限，那么大家就需要好好想想原因了。 以下是一些关联的习惯： 站立会议（习惯38）：注重效率 以固定、有规律的长度运行迭代（习惯17）：确保每个迭代周期的时间相同，但可以灵活选择在该周期来完成哪些工作项（也被称为时间盒模式） 每天结束的时候提交代码，没有任何该工作点的残留：保证每个时间段的思维完整清晰 不加班：不解析 &#160; &#160;]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2012/02/practices-of-an-agile-develope-note-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《高效程序员的45个习惯》简要笔记(2) – 态度决定一切</title>
		<link>http://www.imasson.com/note/2012/01/practices-of-an-agile-develope-note-2/</link>
		<comments>http://www.imasson.com/note/2012/01/practices-of-an-agile-develope-note-2/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 16:05:37 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[敏捷开发]]></category>
		<category><![CDATA[软件开发者]]></category>
		<category><![CDATA[软件工程]]></category>

		<guid isPermaLink="false">http://www.imasson.net/note/?p=95</guid>
		<description><![CDATA[《高效程序员的45个习惯》涵盖了在敏捷开发中应遵从的45条优秀习惯，也是成就一个优秀程序员或团队领导的45条优秀习惯。但这45个习惯涵盖了不少内容，我写下的这几篇笔记，就是尽量把一本书的内容读成几张纸厚。希望在以后忘记这本书后，仍然可以记住总结出来的那一些话，那种感觉。 &#160; 习惯01：做事 在敏捷开发中，做事是重点，解决问题   才是最重要的。这意味着，当团队中有人犯了错误，应针对解决问题的办法，不要针对人。指责错误是不会修复bug的。 在敏捷开发中，团队重结果胜于过程。在现实中，不要死死地执行标准的过程，记住解决问题才是最重要的。 互相帮助而不是互相指责，有助于团队的和谐相处。 如果你没有犯任何错，就说明你没有努力去工作。如果有人犯错，则表示团队中每个人都有可能犯错，确保团队以后都能脱离这种错误。 &#160; 习惯02：欲速则不达 代码工人只想尽快完成工作，而不深入理解代码，或理解工作细节；优秀的程序员，懂得防微杜渐，遇到问题时，不最求速度，而是深入研究，治本而不只是治标。 要编写大家容易理解的代码，保持代码整洁。若不理解这段代码，就不要修改这段代码。因此，不要孤立地编码，多进行代码复审，看别人的代码，确保代码可读和可理解，这也可以提早发现bug。 花时间进行单元测试也是值得的。单元测试有助于你养成代码分层、分块、高内聚的编写习惯，也有助与你和别人理解代码模块（单元测试是可执行的文档）。 &#160; 习惯03：对事不对人 在团队中，以礼待人。任何勾心斗角或嘲笑指责都回扼杀创新。在团队中应让每个人都自由地表达观点。当别人的做法或观点出现明显错误时，请对他询问，并提出你的顾虑。 当我们参加讨论会时，有这样的实践原则：为会议设定最终期限，防止无休止的争辩；使用逆向思维对待别人的观点，客观对待问题，先积极地看到它的正面，再去努力从反面去认识它；设立仲裁人，除了作为会议的决策者外，还要确保每个人都要有平等的发言的机会，维持会议的正常进行；方案被确定后，每个成员都必须支持已经做出的决定。团队需要认识到，设计离不开妥协，软件是否可满足需求是最重要的。 &#160; 习惯04：排除万难，奋勇前进 “别管他妈的鱼类，Drayton上校，全速前进！”——美国南北战争时的海军上将David Farragut。 勇于面对糟糕的代码，并进行重构，花时间用实践向你的老板或同事说明这样做事值得的。当发现问题时也不要掩饰问题，也要有承认错误的勇气。]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2012/01/practices-of-an-agile-develope-note-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>中国十五大社交网站排行榜出炉了，有意思？</title>
		<link>http://www.imasson.com/note/2011/04/top15-sns-china/</link>
		<comments>http://www.imasson.com/note/2011/04/top15-sns-china/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 15:16:13 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[互联网产品]]></category>
		<category><![CDATA[产品设计]]></category>
		<category><![CDATA[资讯评论]]></category>

		<guid isPermaLink="false">http://www.imasson.com/note/?p=173</guid>
		<description><![CDATA[近日，TechRice发布中国十五大SNS网站排行榜，QQ空间居首位(qzone.qq.com)，人人网排第二，新浪微博位居第四，TechRice的这一数据使我们对这些社交网站有了更深层次的参考。（来自视觉中国）大家见人仁见智了。 qq空间（Qzone）——基于6.37亿活跃QQ用户的中国最大的社交网络。Qzone的问题不在于数量，而是这种基于昵称的社交图谱的质量。 人人网（Renren）——Renren是中国实名社交网站的领头羊，近期正打算IPO。它为中国的SNS设立了标准，但是仍然面对着其他社交网站的挑战，比如腾讯的朋友，Kaixin001。 朋友（pengyou）——（即系企鹅的校内咯）腾讯最新推出的一个拥有大量用户的实名社交网络。但问题是，其社交图谱有多强大？ 新浪微博（Sina Weibo）——新浪微博是现在当红的微博客服务，而且以其新的模式正在影响着中国的社交网络。微博客能否因为中国的流行而能够最终超越社交网络？现在的情况是新浪微博从多方面已经超越了Twitter，从评论，图片，视频，IM，和LBS。 Kaixin001——Kaixin001通过社交游戏和内容转发拥有很多白领用户。但是随着对社交游戏狂热感减退，以及新浪微博里的内容更具有转发的吸引力，Kaixin001现在处境很纠结。很多内部人士指出，用户正在急剧下跌。 51.com——51.com曾今在农村用户里比较风靡，但现在也展现出一个螺旋下降的趋势。一份最近的报告指出，51.com在最顶峰的时候只有700，000人同时在线，并对51.com所说的1.78亿注册用户表示怀疑。 豆瓣（douban）——豆瓣可能是中国社交网络中最强有力的社区。在中国，没有一个社区可以以这样爆炸性的增长，拥有如此之大的用户群。它吸引的是中国城市里的年轻人，喜欢一起看看电影，看看书，听听音乐，以及参与其他活动。是一个为潮人和创意人员办的社区。 淘米（Taomee）——淘米时一个社交网络和游戏网站（就像Disney的Club Penguin），在中国儿童（和他们的妈妈）中很流行。淘米实际上是一个很多儿童网站的母公司，旗下拥有：Moer(mole-themed), Saier (sci-fi themed),和 XiaoHua (princess-themed)。 腾讯微博 （Tencent Weibo）——腾讯在很积极的推广其微博，以期与新浪微博相竞争。它声称拥有100m的注册用户，但是腾讯还是面对着那个老问题，不是数量，而是质量 ——艾瑞（iResearch）报告指出新浪微博占据中国用户在微博客上87%的时间，而腾讯只有9%。 佳缘（Jiayuan）——中国最流行的在线相亲网站，有传言说已经 计划要上市。 淘江湖（Tao Jianghu）——基于狂热的电子商务网站Taobao的社交网络。它为淘宝用户定制，但很多都只是个空架子；只有很小一部分的用户处于活跃状态。增加社交层面是淘宝2011年的一个重要目标。 白社会（Bai Shehui）——中国最大门户网站之一搜狐创建的“白领社会”。搜狐在这个平台上开发了自己的社交游戏。 珍爱（Zhenai）——中国相亲网站中一个领先代表，也谣传说在为IPO做准备。 百合（Baihe）——中国相亲网站领头羊之一。 爱情公寓（iPartment）——来自台湾的一个基于虚拟头像的约会网站，年轻人在里面虚拟的住在一个公寓里。收入来自广告，虚拟商品以及电子商务。 &#160; 怎么样？不满意？我也觉得有些网站排名低了，有些网站好像没神马听过，但又很靠前呢？嘿嘿，这就是中国吗，地域的差异是巨大的，有些东西你可能想不到，看图吧。 从上图中可以看出：人人网和豆瓣网在一线城市中较为流行；朋友、QQ空间和51.com更倾向于二三线城市的普及，人人网和朋友在二线城市中也有一定的渗透率。 我们是否可以感受到，企鹅的产品就比较乡村比较草根比较非主流比较差劲，其设计充分体现了这一点。但反观豆瓣、新浪微博，给人的感觉就比较优雅而时尚。不同的人欣赏角度就不同，但是什么造就不同的人呢，你们懂得，都说了看图了。 关键是把握好产品针对的人群，并为以后创造出自己的特色道路，并吸引更加多的用户。是机会了，有意思吧？ &#160; 部分文字转载自视觉中国，文章链接：http://c.chinavisual.com/2011/04/08/c75947/index.shtml]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2011/04/top15-sns-china/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《Effective C#》每天一条(09) &#8211; 理解几个相等判断的方法</title>
		<link>http://www.imasson.com/note/2011/04/effective-csharp-09/</link>
		<comments>http://www.imasson.com/note/2011/04/effective-csharp-09/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 14:31:11 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[.Net开发]]></category>
		<category><![CDATA[CLR基础与参考]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.imasson.com/note/?p=171</guid>
		<description><![CDATA[当你创建你自己的类型时(不管是类还是结构)，你要定义类型在什么情况下是相等的。 做法 C#提供了4个不同的方法来断定两个对象是否是相等的： public static bool ReferenceEquals( object left, object right ); public static bool Equals( object left, object right ); public virtual bool Equals( object right); public static bool operator==( MyClass left, MyClass right ); 前两种静态方法我们“永远都不必要重新定义”。C#希望我们每一个对象都可以用一套标准的规则来判断是否相等，前两种方法应该又C#自己实现，而且它们已经很好地做该做的工作了。后两种方法，我们应当按需要进行自定义。通常值类型需要重写后两种方法，引用类型一般就不需要处理了。 为什么？ Object.ReferenceEquals()静态方法用于判断内存中引用是否相等。 Object.Equals()静态方法用于在不知道两个变量的运行时类型时，判断是否相等。该方法实际上把判断交给了其中一个对象的Equals方法来实现（即后面要提及的重写的非静态）。 Object.Equals()实例方法用于真正地判断两个对象是否相等，我们可以在这里自定义“相等”的判断规则。 对于自定义的值类型，由于C#默认会使用低效率的反射操作来进行判断，因此我们总是应该重写Equals()实例方法，这样就可以加快判断速度。 对于引用类型，默认是进行引用的相等性判断。仅当我们需要用“值语义”，即我们自定义的规则来判断相等性时，才要重写该方法。string就是一个最佳的例子，string是引用类型但可以通过Equals或“==”来判断相等性（与JAVA大大的不同喔）。 Object.operator==()方法与Object.Equals()实例方法类似，代码上可以用“==”来进行判断，显得更具简洁性和数学的味道。使用的原则与Object.Equals()实例方法也是基本相同的。自定义的值类型记得要override该方法喔。不过引用类型一般是不需要重写该方法的，但值类型要注意了，真的很简单。]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2011/04/effective-csharp-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转][译稿]手机用户体验设计的四个关键原则</title>
		<link>http://www.imasson.com/note/2011/03/mobile-ux-design-of-the-four-key-principles/</link>
		<comments>http://www.imasson.com/note/2011/03/mobile-ux-design-of-the-four-key-principles/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 01:38:45 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[交互设计]]></category>
		<category><![CDATA[设计理论]]></category>
		<category><![CDATA[产品设计]]></category>
		<category><![CDATA[用户体验]]></category>
		<category><![CDATA[移动]]></category>

		<guid isPermaLink="false">http://www.imasson.net/note/?p=166</guid>
		<description><![CDATA[原则 1：用户和手机具有亲密的关系。 虽然个人与手机之间的关系可能似乎是被赋予的，但这种亲密关系的深度可能比最初设想得要深。 想象一下，炎炎夏日，有人问你是否可以借用手机拨打电话，你会递过去吗？ 什么样的信任会触发这样的简单动作呢？考虑一下你周围的人，有多少人你会毫不犹豫地把手机递过去呢？ 在你的社交圈，拒绝这样的要求难道不是可被接受的吗？假设此人是很尊重你的手机和手机里的个人资料。但是通话结束后，你会发现，它已经积攒了很多粘粘的汗液，这在夏日是很平常的。 从粘稠的物理表层到数据隐私安全层面，都标志着手机与人具有密切的联系。我是我的手机， 我的手机就是我。 原则 2：屏幕尺寸意味着用户的状态。 假设你一直期待着看某部大片，电影上映那一天你来到了当地最大的电影院。比方说，当你坐下的时候，你发现邻座的笑声非常可怕，而你又无处可坐了，这部片子你都盼了一年了，那么你宁可放弃这样的体验而离开影院吗？我想根本不会有人这么做的。 如果场景换一下，你和朋友在家里通过52英寸的大屏幕观看的时候，你身边坐了一位这么个恼人的家伙呢？也许仍不太可能。如果是在大学宿舍，观看着22英寸的电脑屏幕呢？你放弃的可能性会增加了。那么若是3.5英寸的屏幕呢？ 虽然有一些社会和环境因素会影响上述体验情节中用户的放弃率，但始终可以通过他们的参与度，评估不同的屏幕尺寸对用户体验水平的影响。由于移动设备在用户体验中可能算是最小的屏幕，手机的体验设计必须能适应用户分散的注意力。 原则 3：手机界面可能会被截断（truncated）。 最可怕的任务，莫过于从老手机向新买的手机导入数据。在前几年，你或许需要通过12键的键盘费力地输入所有联系人。近年来，Palm手机通过全尺寸 的键盘能够让用户方便地输入数据。事实上，同步的概念已经无所不在，移动计算领域，网络身份的同步是谷歌Android操作系统的核心支柱。 即使搭配了小型的全尺寸键盘， 越来越成为所有移动设备的标准功能，但是手机的界面依旧是被截断的，用它能够很好地操作数据，但不是输入数据。 无论如何，数据输入不太可能成为手机设备上很舒服的行为。 原则 4：为移动平台设计。 4.1.语音 曾经语音是最原始的手机平台，但在未来它也是最含糊不清的平台。 人们总是需要偶尔打电话。但频率在下降。为什么？电话语音相比其他交互方法已经很难被优化。例如，大多数银行都提供电话银行和网上帐户访问。你一般更多地 选用哪个方式呢？你真的愿意打过去，等待5分钟，然后口述任务，还是更愿意使用 图形界面这样做？ 4.2.消息 绝大部分短信流量由小团体的社交行为构成。第二多的流量是简单的任务，如投票、参赛、收到通知等。在这两种情况下，都不是以堆砌的内容为主。 4.3.互联网 互联网是最具争议性的移动平台。 目前，几乎95％的互联网用户都是通过1024 × 768或更高分辨率的显示屏来访问网站。但手机显示屏一般在60 × 120和480 × 320范围之内，大多数基于互联网的体验不是为手机用户设计的。 随着基于互联网的移动体验变得更以设备为中心和越来越复杂，人们已开始创建类似的手机应用，从而创造一种情景，用户在应用程序中能具有以互联网为基 础的体验。尽管应用程序可以使用诸如传感器、特别网络、光学元件等，而基于互联网的体验则不能。因此，管理用户的体验很重要，如果一个体验看上去像是应用 程序的行为，那么它就应该是一个应用程序——反之亦然。 4.4.应用程序 从技术角度来看，应用程序代表执行在特定的手机环境，有选择性的安装，并且获得该设备的所有的功能。 然而，从用户体验的角度来看，他们代表了一个专门的交互设计，满足富裕、高端、有针对性的移动用户群。 2年前，在移动设备上安装应用程序还需要一些技能。 但近来，随着“app stores”的迅猛发展，这个任务已变得更方便。 但综合考虑，手机应用软件的仍是小众的热情所构成的。对于那些想用、并知道如何用应用程序的小众来说，手机应用程序是个强大的工具。 结论 就目前而言，手机用户体验的对话应该集中于高层次的原则，而不仅仅是战术的细节。 作为手机的用户体验设计师，在我们面前同时面临着机会和选择。 其机会是指，在体验领域建立稳定的基础原则。其选择既因为它是今日的潮流而令人心情激荡，也是因为我在追求、建立、并实施基础原则。 本文作者：Dakota Reese Brown，此前在乔治亚理工学院的技术组担任手机的用户体验研究员，具备两年工作经验。 [...]]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2011/03/mobile-ux-design-of-the-four-key-principles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《Effective C#》每天一条(08) &#8211; 确保0为值类型的有效状态</title>
		<link>http://www.imasson.com/note/2011/03/effective-csharp-08/</link>
		<comments>http://www.imasson.com/note/2011/03/effective-csharp-08/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 14:02:51 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[.Net开发]]></category>
		<category><![CDATA[CLR基础与参考]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.imasson.net/note/?p=161</guid>
		<description><![CDATA[为什么？ 在.Net中，引用类型会被初始化为二进制的0，表示地址为0；但基本的值类型会被自动初始化为数值0，我们无法保证其他程序员为为值类型进行特定的初始化赋值（有些程序员很懒？）。因此值类型很有可能就保持为0的状态，我们应该考虑将0作为值类型的默认值，并确保值类型为0时仍然有效以维持代码的健壮性。 应用场景 枚举类型是比较典型的情况。默认构造函数会把枚举值初始化为0，因此如果枚举值中没有0的话，这个枚举值很有可能就是无意义或无效的。因此我们推荐把0值明确表示出来（比如用None表示）。 特别是如果枚举使用标志位(flag)时，更应用0表示None，而不应表示其他单词或意思。这样可以在进行位运算时明确与None值运算时产生的效果，如果是其他单词的话，可能使用着就意识不到其值为0了。 对于struct而言，由于struct总是有默认构造函数（只是声明的时候），因此也应考虑其成员默认初始值的问题。如果struct中含有string等类型的成员时，如果使用默认初始化时，这些成员就是空值(Null)了，在它们的时候就可能出错了。避免这种情况的办法是在属性的get方法中动动手脚，防止返回null。如下代码所示： 但这样做的话，可能就改变了原字段的值了(由null变成了”null”)，可能违反了代码的初衷，应该加以思考，辨别此时null是否有意义，从而决定是否应该把null的字段返回为内容为空字符串。]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2011/03/effective-csharp-08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]绘制交互流程图</title>
		<link>http://www.imasson.com/note/2011/03/drawing-interactive-flowchart/</link>
		<comments>http://www.imasson.com/note/2011/03/drawing-interactive-flowchart/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 05:21:03 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[交互设计]]></category>
		<category><![CDATA[设计理论]]></category>
		<category><![CDATA[产品设计]]></category>

		<guid isPermaLink="false">http://www.imasson.net/note/?p=157</guid>
		<description><![CDATA[学习产品设计初期肯定会遇到两个问题：第一，如何考虑更全面；第二，如何绘制交互流程图。开始产品设计前先要考虑所有可能性，如何才能以线性流程图的方法组织所需的设计元素。小郑老师的《交互设计表格》中已经介绍了非常实用的表格穷举法，适合初学者使用。 流程图是产品经理和交互设计都必须掌握的技能，一张流程图可以省去需求文档和交互设计文档的很多文字描述，让技术人员一目了然地明白设计意图，便于组织程序的逻辑顺序。 绘制流程图准从简单的原则，流程图是设计师的产出物，体现设计意图，主要给技术人员和测试人员浏览，至于自己是如何思考不应体现在流程图中。别人也要早点回家被老婆，没有时间关心你如何的细心的考虑，也不关心用户会如何思考和操作的，请直接给他们展示设计的结果。 复杂和纠结留给自己，简单留给别人。对用户是这样，对工作同伴也是如此。 图例1：手机程序开机检查更新的流程图 流程图包括以下图形： 矩形表示交互环节 菱形表示问题判断 箭头表示工作流方向 也有用圆角矩形表示“开始”和“结束”，个人一般不要该图形，因为从上而下的线性流程图。最顶部的图形或者箭头开始的部分是流程图的“开始”，如图 例中，开启程序触发了事件，程序开始检查更新；最底部的图形或者箭头终止的部分是流程图的“结束”，如重启程序和不再提示表示本次事件结束，无须以图形区 分表示“开始”和“结束”。 流程图容易和操作步骤混淆，比如《交互设计表格》中的登录框操作步骤是： 点击登录，弹出登录框 点击用户名输入框，输入用户名 点击密码输入框，输入密码 点击登录 操作步骤是用户正常情况下完成某项操作所需的操作，而交互流程图（严格意义上叫程序流程图）表达是执行逻辑的路径，通俗地将是当用户点击某个按钮之后，程序执行命令的顺序。更复杂的系统流程图可用于产品架构。 当用户点击的登录框之后，文字描述程序执行的顺序： 检查用户名是否为空。如为空，提醒用户“请您输入用户名”。如果用户名设置要输入手机号码，还要检查手机号码是否是否以13/15/18开头的11位数字。 检查密码是否为空。如为空，提醒用户“请您输入密码”。 检查用户名是否是已用账户。程序提交数据与服务器数据进行比对。如果不是，提醒用户“用户名不正确”。疑问：用户名有误和不存在是如何判断的? 检查密码是否与账户匹配。如错误，提醒用户“密码输入不正确”。 现多数登录框将4和3合并，只提醒“用户名或密码不正确”，可能是告知用户过于准确的信息之后会增加盗号风险。 转载自：曉生語錄 原文地址： http://daichuanqing.com/index.php/archives/2399]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2011/03/drawing-interactive-flowchart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《Effective C#》每天一条(07) &#8211; 值类型应表现为具有常量性和原子性</title>
		<link>http://www.imasson.com/note/2011/03/effective-csharp-07/</link>
		<comments>http://www.imasson.com/note/2011/03/effective-csharp-07/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 07:53:50 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[.Net开发]]></category>
		<category><![CDATA[CLR基础与参考]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.imasson.net/note/?p=152</guid>
		<description><![CDATA[为什么？ 具有常量性的类型可以保证其内部的正确性，而且也确保了线程安全。构建具有原子性的值类型有助于实现其常量性。 实例 假设现在有两个类型：Address、Customer，我们应该如何定义呢。 正确答案是，Address定义为一个值类型，Customer定义为一个引用类型。 因为Customer一般由姓名、地址、电话等属性组成，任意一个属性改变都不会导致问题，也是合理的。而Address一般由邮编、城市、街道等属性组成，这些属性任意一个改变了，则整个Address都会失效了（不可能城市名变化了，邮编和街道名不变吧），因此具有原子性。 正是因为Address具有原子性，我们为了确保其要么对象始终有效，要么不使用该对象，我们还必须保证其具有常量性。 保证常量性的做法很简单： 在字段上加上readonly 不使用set方法，只提供get方法 仅使用构造函数初始化字段 补充说明 初始化常量性类型一般就有三种类型： 使用构造函数进行初始化（最简单，即上面实例中的做法） 使用工厂方法进行初始化(factory method)，对于创建常用的值比较方法。如Color类型中提供的静态方法：Color.FromKnowColor()、Color.FromName()等 对于最复杂的情况，需要多个步骤才可以构造的值，可以创建一个用于存储和执行创建过程的可变辅助类来解决。如string就可以通过一种这样的类StringBuilder，通过不定数量的步骤构造]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2011/03/effective-csharp-07/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《Effective C#》每天一条(06) &#8211; 明辨值类型和引用类型</title>
		<link>http://www.imasson.com/note/2011/03/effective-csharp-06/</link>
		<comments>http://www.imasson.com/note/2011/03/effective-csharp-06/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 07:21:30 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[.Net开发]]></category>
		<category><![CDATA[CLR基础与参考]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.imasson.net/note/?p=147</guid>
		<description><![CDATA[“正确的选择依赖于我们期望将来的客户程序如何使用我们的类型” 区别 我们在创建复合类型的时候，可以选择struct或class。 struct是值类型，不支持多态，比较适合存储应用程序操作的数据。值类型在内存上存放在栈上，因此比较适合体积较小的轻量级类型。 class是引用类型，支持多态，比较适合存储业务数据或定义行为。引用类型在内存上存放在堆上，因此实际使用时需要付出堆内存分配、解析和垃圾回收的代价，适合体积较大使用较不频繁的类型。 实例 对于上述代码，如果MyType是一个值类型，则只需要一次分配，大小为MyType对象大小的100倍。如果MyType是一个引用类型，则只进行一次分配，大小为100个指针的大小，分配后数组各元素为null。如果以后我们还需要初始化数组中的元素，则需要进行多100次分配。由此可见，如果我们需要存储大量数据，引用类型对象会因为频繁分配空间大大降低效率。 建议 一般而言，我们创建引用类型的机会比值类型多得多。用于定义程序行为或业务数据的类型应设为引用类型。仅在这些特殊情况下使用值类型： 该类型的主要职责是负责底层的轻量的数据存储 该类型的公有接口完全由一些数据成员的简单的存取属性定义 该类型永远不会有子类，也不可能具有多态行为 如果满足上述条件，使用值类型就可以获得效率优势了！]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2011/03/effective-csharp-06/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《Effective C#》每天一条(05) &#8211; 提供ToString方法</title>
		<link>http://www.imasson.com/note/2011/03/effective-csharp-05/</link>
		<comments>http://www.imasson.com/note/2011/03/effective-csharp-05/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 15:59:00 +0000</pubDate>
		<dc:creator>Masson</dc:creator>
				<category><![CDATA[.Net开发]]></category>
		<category><![CDATA[CLR基础与参考]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.imasson.net/note/?p=143</guid>
		<description><![CDATA[“我们创建的每一个类都应该重写来自基类Object的ToString()方法。” 为什么？ 很多地方都需要对象通过ToString()方法输出有关信息，包括在Windows Forms、Web Forms以及控制台输出窗口中。如果我们能按需要重写该方法，该方法就可以有助于调试环境和记录运行信息，比只输出类型名要有用很多。如果我们还实现IFormattable.ToString()方法，我们还可以实现多种自定义格式的、灵活的可读信息输出。 应用场景 如以下代码，即可重写ToString()方法，并输出有用的信息。 我们还可以通过实现IFormattable接口来实现灵活的格式化输出，当然格式可以自己来定： 当然上述的代码只是举例，更好的做法是使用正则表达式来解析格式。 添加了这样的函数后，你就让用户具有了可以这样指定customer数据的能力： 前面的代码中，格式都是写死在代码中的，但如果我们需要随时扩充格式化的能力，我们就需要实现一个实现IFormatProvier接口的类，让它来替我们解析格式字符串。这个对象将作为刚才ToString()方法的第2个参数，也就是说是可以替换。其实这种做法利用了策略模式，令我们得到随时扩充的能力。 下面的代码演示了如何定义IFormatProvier接口的类。要注意的是还需要实现一个ICustomFormatter接口的类，该类是真正负责格式字符串解析的类；而实现IFormatProvier接口的类，则表示能提供格式化字符串输出功能的类。 实现了这么长的代码了，究竟如何使用呢。还记得String.Format()方法吗，如以下代码： 补充说明 重写Object.ToString()是为类提供字符串表示的最简单方法，推荐我们创建类的时候都按需要重写。 ToString()方法提供的字符串应该是友好的，易于人去理解的。 只有少数情况下，我们对于复杂的类，或需要使用多种方式灵活输出信息时，再考虑实现IFormattable接口。]]></description>
		<wfw:commentRss>http://www.imasson.com/note/2011/03/effective-csharp-05/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

