一个开源的Asp.net2.0博客系统
架构模式
一、分层架构模式
按照抽象层次的高低划分,是系统纵向划分,每个层次纯粹为逻辑概念,与物理无关;该模式主要好处有:
1、每个层次可以独立进行变化,而互不影响;
2、容易在不同层次接纳新技术与变化;
二、Facade架构模式
外部与一个子系统的通讯通过统一的门面进行,降低外部系统对内部实现的依赖性
三、Mediator架构模式
包装一系列对象(系统)相互作用的方式,使得他们彼此不必互相了解,达到松耦合
架构模式类型
一、 From Mud to Structure型
帮助架构师将系统合理划分,避免形成一个对象海洋(A sea of objects)。包括Layers(分层)模式、Blackboard(黑板)模式、Pipes/Filters(管道/过滤器)模式等。
二、分布系统(Distributed Systems)型
为分布式系统提供完整的架构设计,包括像Broker(中介)模式等
三、人机互动(Interactive Systems)型
支持包含有人机互动介面的系统的架构设计,例子包括MVC(Model-View-Controller)模式、PAC(Presentation-Abstraction-Control)模式等
四、Adaptable Systems型
支持应用系统适应技术的变化、软件功能需求的变化。如Reflection(反射)模式、Microkernel(微核)模式等
1. 添加 UNICODE 和 _UNICODE 预处理定义
位置:Project Settings -> C/C++ -> Preprocessor definitions
添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)
2. 使用宽字符相关类型,如:char -> TCHAR、char * -> LPTSTR、const char * -> LPCTSTR
3. 对字符串常量使用 _T() 宏
4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp -> _tcscmp 等,类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa -> _itot 等。
5. 将 Project Settings -> Link -> Output -> Entry Point 设为 wWinMainCRTSTartup,否则会有如下错误:msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本,可在StdAfx.h中添加:
- #ifdef _UNICODE
- #define tstring wstring
- #else
- #define tstring string
- #endif
然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream 等
7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:
CString s = _T("ABC");
ASSERT(s[0] == 'A');
8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可继续使用;如需进行Unicode字符串和ANSI字符串的互转换,可使用 MultiByteToWideChar 和 WideCharToMultiByte
亲身体会:最实用的管理小技巧,一次只说一件事
有很长一段时间,我常为团队的「笨」感到困扰,我交代的事,常常不能如期完成;许多的事,我经常一讲再讲,但还是有人会犯同样的错,到最后我不得不抓着他们的手,一步一步的追踪,才能勉强完成,我甚至自怨自艾,怎么会找到一群「笨」人呢?
直到有一次,我遇到一个知名企业的高级主管,谈起他的老板怎么要求他们。
他说:他的老板意志非常坚定,想要做的事一定要做到,但他有一个好处,是「一次只要求一件事」,想做产品时,只谈产品,反复谈,反复要求,方向明确,一直要确定大家都知道怎么做,并能如期,而且按照他的要求完成时,他才会放手。然后再要求下一件事,因此他们的公司能完全按照老板的进度,一步步的完成公司的目标。
听完这些话,我宛如当头棒喝!原来不是我的团队「笨」,而是我不会当老板、不会训练、不会要求,再加上心浮气躁,急切的想完成所有的事,经常同时交代了太多 的事,设定了太多的目标,凡事匆忙,以至于所有的人,随着我复杂的指令团团转,最后一件事也没做好,我竟然无知的认为自己的团队「笨」!
我开始尝试「一次只说一件事,一次只要求一件事」,刚开始,我难免还是急切的把两、三件事情,归纳成一件事,以加快进度,但效果不佳,最后我不得不耐住性子的再拆解成更细、更单纯的「一件事」,效果就变好了,团队慢,但跟得上我的脚步,我的要求也逐渐能贯彻!
「一次只说一件事」,用在训练人时,效果尤其显著;当目标明确、流程简单时,就算是新人,也往往很容易完成你的要求。我发觉每一个人学习的过程,通常处在高度的紧张状况,他们一次完成的可能性极低,因此一次只做一件事,只做一件简单的事,是极重要的训练方法。
而且在每一次他们完成一件事时,要给予正面、明确的肯定,更是所有工作者最重要的激励要素,当他们可以一件件完成工作,一步步学习各种技巧,组织团队的默契也慢慢养成。
这其中只有一件事要克服,那就是老板的个性及限期完成工作的压力。我就是那个「急惊风」的老板,说风就是雨,一切以速度取胜,我难以忍受「慢慢来」的节奏,但是后来我终于认知,如果没有训练有素、鱼水和谐的团队,所有的「急」,都只会变成灾难。因此在训练团队、训练新人时,我不断的告诉我自己:「一次只说一件事」,不能急,慢慢来。
至于当主管面临限期完成压力时,而你的团队又不够成熟,该怎么办?结论还是一样,你不能让不成熟的人负担他担负不了的责任,你也一样不能让你的团队承受他们 能力以外的事,切割出他们可以做的事,还是「一次只要求一件事」,至于完成不了的事,只有主管自己用智能、用创意去「草船借箭」了!
1、CFileFind类的声明文件保存在afx.h头文件中。
2、该类的实现的功能:执行本地文件的查找(查找某个具体的文件,查找某类文件x*.x*,查找所有文件*.*)
3、CFileFind类是CGopherFileFind和CFtpFileFind类的基类。
4、CFileFind类的构造函数::CFileFind()和关闭函数::Close()我会成对使用。
5、CFileFind类的成员函数我根据其操作特性划分为3类:查找操作类、获得文件属性类、判断文件属性类。(下面我先进行函数罗列并没有完整的描述函数的参数)
查找操作类
::FindFile();
::FindNextFile();
获得文件属性类
::GetCreationTime();
::GetLastAccessTime();
::GetLastWriteTime();
::GetFileName();
::GetRoot();
::GetFilePath();
::GetFileTitle();
::GetFileURL();
::GetLength();
判断文件属性类
::IsArchived();
::IsCompressed();
::IsDirectory();
::IsDots();
::IsHidden();
::IsNormal();
::IsReadOnly();
::IsSystem();
::IsTemporary();
::MatchesMask();
6、CFileFind类中成员函数使用应注意的顺序
在创建了CFileFind对象后,先执行::FindFile()函数,然后执行::FindNextFile(),然后选择执行(获得文件属性类)的函数或者(判断文件属性类)函数。
7、CFileFind类成员函数的详细分析:
- using System;
- using System.Reflection;
- public class SimpleClass
- {
- private void aPrivateMethod()
- {
- Console.WriteLine("you called me!");
- }
- }
- public class Tester
- {
- public void Test()
- {
- //code snipped to invoke method
- //create an object of our class and get Type
- SimpleCass targetObj = new SimpleClass();
- Type classType = targetObj.GetType();
- //get method: be careful to BindingFlags options.
- MethodInfo thePrivateMethod = classType.GetMethod("aPrivateMethod",
- BindingFlags.NonPublic | BindingFlags.Instance);
- //invoke method on the object
- thePrivateMethod.Invoke(targetObj, null);
- }
- }
- using System;
- using System.Threading;
- public class MemoryCleaner
- {
- private const int PERIOD_IN_MS = 500;
- private static int _counter;
- private Thread _thread;
- private AutoResetEvent _event = new AutoResetEvent(false);
- public MemoryCleaner()
- {
- }
- public void Start()
- {
- Stop();
- _thread = new Thread(new ThreadStart(run));
- _thread.Name = string.Format("MemoryCleaner#{0}"
- , Interlocked.Increment(ref _counter));
- _thread.IsBackground = true;
- // this makes thread to be stopped when Main thread is over
- _event.Reset();
- _thread.Start();
- }
- public void Stop()
- {
- if (_thread != null)
- {
- _event.Set();
- _thread.Join();
- _thread = null;
- }
- }
- private void run()
- {
- while (!_event.WaitOne(PERIOD_IN_MS, false))
- {
- GC.Collect();
- GC.WaitForPendingFinalizers();
- }
- }
- }