1.android应用开发如何有效利用各种设计模式?设计式源
2.Linux内核源码解析---万字解析从设计模式推演per-cpu实现原理
3.请列举一些您用到过的设计模式以及在什么情况下使用该模式?
4.cè¯è¨ç¼ç¨
5.为什么 MyBatis 源码中,没有我那种 if···else
android应用开发如何有效利用各种设计模式?
在Android应用开发中,有效地利用设计模式是源码提高代码质量、增强代码可读性和可维护性的处设关键。设计模式是计模解决特定问题的通用解决方案,它们在不同场景下具有广泛的好处cema指标源码适用性。理解并应用这些模式能够帮助开发者构建更高效、设计式源更模块化的模式码代码。以下是源码几个在Android开发中常见的设计模式实例:
1. **Proxy Pattern(代理模式)**:以AIDL(Android Interface Definition Language)的Binder机制为例,它在应用内部实现了Stub类,处设充当了真正的计模实现类和客户端之间的代理。通过这种方式,好处代理模式可以隐藏实现细节,设计式源增强代码的模式码封装性和灵活性。
2. **Active Object Pattern(主动对象模式)**:在Android中,源码消息机制如Handler、Message、Looper和Message Queue的使用,可以看作是主动对象模式的实例。这种模式通过主动对象主动向其他对象发送消息,无需等待回复,从而简化了进程间通信的复杂性。
3. **Half-Sync Half Async Pattern(半同步半异步模式)**:AsyncTask框架正是这一模式的典型应用,它允许在主线程中执行耗时任务,dnf召唤怪物源码同时利用异步线程进行操作,实现了同步和异步处理的结合,提高了用户体验和系统性能。
4. **Thread-Specific Storage Pattern(线程特定存储模式)**:ThreadLocal类在Android中用于实现线程局部变量,确保每个线程可以访问自己的私有变量,而不影响其他线程的变量状态,提高了代码的并发安全性。
5. **Monitor Object Pattern(监视器对象模式)**:Java线程的同步机制,通过Monitor Object实现,控制对共享资源的访问,确保线程安全,是并发编程中的重要手段。
基本的设计模式,如Command Pattern(命令模式)、Factory Method Pattern(工厂方法模式)、Template Method Pattern(模板方法模式),在Android Framework层中普遍存在,这些模式有助于构建更加结构化、模块化的代码。
理解并熟练应用这些设计模式,需要通过实践和阅读源码来积累经验。然而,值得注意的娃哈哈到家源码是,设计模式的使用不应成为强制性的要求,而应根据实际需求灵活选择。过度依赖设计模式可能导致性能损失,因此在应用时应权衡代码的可读性、可维护性和性能成本。
为了进一步深入学习设计模式,推荐以下几个MOOC课程,它们提供了从模式意图、应用场景到实际应用分析的全面教学内容,有助于构建系统性的知识体系:
1. **线程同步中的设计模式**:<a href="coursera.org/course/pos...
2. **通信中的设计模式(本地IPC,远程IPC)**:<a href="coursera.org/course/pos...
3. **面向模式的软件架构(POSA)**:<a href="coursera.org/course/pos...
通过这些资源的学习,可以深入理解设计模式在实际开发中的应用,为构建高质量的Android应用奠定坚实的基础。
Linux内核源码解析---万字解析从设计模式推演per-cpu实现原理
引子
在如今的大型服务器中,NUMA架构扮演着关键角色。它允许系统拥有多个物理CPU,不同NUMA节点之间通过QPI通信。虽然硬件连接细节在此不作深入讨论,但需明白每个CPU优先访问本节点内存,当本地内存不足时,可向其他节点申请。从传统的SMP架构转向NUMA架构,主要是mm威客源码为了解决随着CPU数量增多而带来的总线压力问题。
分配物理内存时,numa_node_id() 方法用于查询当前CPU所在的NUMA节点。频繁的内存申请操作促使Linux内核采用per-cpu实现,将CPU访问的变量复制到每个CPU中,以减少缓存行竞争和False Sharing,类似于Java中的Thread Local。
分配物理页
尽管我们不必关注底层实现,buddy system负责分配物理页,关键在于使用了numa_node_id方法。接下来,我们将深入探索整个Linux内核的per-cpu体系。
numa_node_id源码分析获取数据
在topology.h中,我们发现使用了raw_cpu_read函数,传入了numa_node参数。接下来,我们来了解numa_node的定义。
在topology.h中定义了numa_node。我们继续跟踪DECLARE_PER_CPU_SECTION的定义,最终揭示numa_node是一个共享全局变量,类型为int,存储在.data..percpu段中。
在percpu-defs.h中,numa_node被放置在ELF文件的云监控支付源码.data..percpu段中,这些段在运行阶段即为段。接下来,我们返回raw_cpu_read方法。
在percpu-defs.h中,我们继续跟进__pcpu_size_call_return方法,此方法根据per-cpu变量的大小生成回调函数。对于numa_node的int类型,最终拼接得到的是raw_cpu_read_4方法。
在percpu.h中,调用了一般的read方法。在percpu.h中,获取numa_node的绝对地址,并通过raw_cpu_ptr方法。
在percpu-defs.h中,我们略过验证指针的环节,追踪arch_raw_cpu_ptr方法。接下来,我们来看x架构的实现。
在percpu.h中,使用汇编获取this_cpu_off的地址,代表此CPU内存副本到".data..percpu"的偏移量。加上numa_node相对于原始内存副本的偏移量,最终通过解引用获得真正内存地址内的值。
对于其他架构,实现方式相似,通过获取自己CPU的偏移量,最终通过相对偏移得到pcp变量的地址。
放入数据
讨论Linux内核启动过程时,我们不得不关注per-cpu的值是如何被放入的。
在main.c中,我们以x实现为例进行分析。通过setup_percpu.c文件中的代码,我们将node值赋给每个CPU的numa_node地址处。具体计算方法通过early_cpu_to_node实现,此处不作展开。
在percpu-defs.h中,我们来看看如何获取每个CPU的numa_node地址,最终还是通过简单的偏移获取。需要注意如何获取每个CPU的副本偏移地址。
在percpu.h中,我们发现一个关键数组__per_cpu_offset,其中保存了每个CPU副本的偏移值,通过CPU的索引来查找。
接下来,我们来设计PER CPU模块。
设计一个全面的PER CPU架构,它支持UMA或NUMA架构。我们设计了一个包含NUMA节点的结构体,内部管理所有CPU。为每个CPU创建副本,其中存储所有per-cpu变量。静态数据在编译时放入原始数据段,动态数据在运行时生成。
最后,我们回到setup_per_cpu_areas方法的分析。在setup_percpu.c中,我们详细探讨了关键方法pcpu_embed_first_chunk。此方法管理group、unit、静态、保留、动态区域。
通过percpu.c中的关键变量__per_cpu_load和vmlinux.lds.S的链接脚本,我们了解了per-cpu加载时的地址符号。PERCPU_INPUT宏定义了静态原始数据的起始和结束符号。
接下来,我们关注如何分配per-cpu元数据信息pcpu_alloc_info。percpu.c中的方法执行后,元数据分配如下图所示。
接着,我们分析pcpu_alloc_alloc_info的方法,完成元数据分配。
在pcpu_setup_first_chunk方法中,我们看到分配的smap和dmap在后期将通过slab再次分配。
在main.c的mm_init中,我们关注重点区域,完成map数组的slab分配。
至此,我们探讨了Linux内核中per-cpu实现的原理,从设计到源码分析,全面展现了这一关键机制在现代服务器架构中的作用。
请列举一些您用到过的设计模式以及在什么情况下使用该模式?
1.原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
使用场景:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用
2.组合模式(Composite Pattern)也叫合成模式:将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
使用场景:组合模式在项目中到处都有,比如现在的页面结构一般都是上下结构,上面放系统的Logo,下边分为两部分:左边是导航菜单,右边是展示区,左边的导航菜单一般都是树形的结构,比较清晰,有非常多的JavaScript源码实现了类似的树形菜单,大家可以到网上搜索一把。
等等。
如果你想了解每一种模式的使用场景,可以看看《设计模式之禅》,里面介绍了种设计模式分别的使用方法,还有设计模式混搭和PK,对于想了解设计模式的人来说是比较不错的参考手册
cè¯è¨ç¼ç¨
ç¨åºåãæ¨èC++ å¾ä¹¦ä¸äººè°
主æ人ï¼çèï¼éæï¼ï¼ãç¨åºåãæå¿ç¼è¾ï¼C-Viewæå
å 宾ï¼å岩ï¼æ¢¦éï¼,èæ³å ¬å¸æä¸è®¾å¤äºä¸é¨åºç¨å¼åå¤ä»»èï¼C-Viewæåãä¸ä¾¯æ·å çåè¯ãC++ Standard Libraryãä¸ä¹¦
éå°¹ï¼æ¶éï¼ï¼ä¸æµ·å¤©å®å ¬å¸CTOï¼å¨ãç¨åºåãè¿è½½æâèªç±ä¸ç¹è£çå½åº¦âç³»åæç«
éæï¼âå¦C++ç¨åªæ¬ä¹¦å ¥é¨âï¼è¿æ¯è¢«é®å¾æå¤çä¸ä¸ªé®é¢ãä½æ¯åªä¸æ¬ä¹¦æ¯æ好çå ¥é¨ä¹¦ï¼ä¼¼ä¹å¾é¾æ¾å°çæ¡ããC++ Primerã太åï¼ãEffective C++ã对读è è¦æ±æ¯è¾é«ï¼ãEssential C++ãå常常被æ¹è¯ä¸ºâå¤ªæµ âã
å ¶å®è¯´ç©¿äºï¼no silver bulletãæ³ä»ä¸æ¬ä¹¦å¦ä¼C++ï¼é£æ¯ä¸å¯è½çãææåé®æå¦ä½å¦C++ï¼æä¼å»ºè®®ä»å å»æ¾æ¬æ°æ®ç»æ书ï¼æéé¢çä¹ é¢å ¨é¨ç¨C++åä¸éï¼ç¶ååå»çãEffective C++ããmyanç»å¸¸è¯´âè¦å¨å¦ä¹ åæå »æå¥½ä¹ æ¯âï¼æ对æ¤é¢ä¸ä»¥ä¸ºç¶ã
个人认为ï¼ãEssential C++ãéåä½ææï¼ãC++ Primerãéåä½åè书ï¼ãEffective C++ãéåä½è¯¾å¤è¯»ç©ã
æ¶éï¼å¾åæå½åä¹°äºãC++ Primerããå 为ä»æ个人è§åº¦æ¥çï¼å®çåè½æç¨åºæ¬æ¯åãThe C++ Programming Languageãéåãå½ç¶å¯¹äºå ¥é¨æ¥è¯´ï¼å®è¿æ¯å¾ä¸éçãä½æ¯ãC++ Primerã太åï¼ä¸æ¥å¯¼è´ç书æå ¶ä¸æ¹ä¾¿ï¼äºæ¥ç³»ç»å¦ä¹ éè¦è±æ¯è¾é¿çæ¶é´ã对äºç®åè¿ä¸ªè¶æ¥è¶å¿«é¤åçæ¶ä»£æ¥è¯´ï¼çç¡®æå¾å¤ä¸éåçå°æ¹ï¼ä¸è¿å¯ä»¥ä½ä¸ºåå¦è çåè书ãç°å¨æ以ä¸åK3 CPUç代价æå®åç»äºå«äººï¼å¸ææé£ä½åäºè½å¤ä»ä¸å¾å°ä¸äºçå¤ã
å¦æå·²ç»å ·å¤äºCåºç¡ï¼æ建议çå½å ç书ï¼ä¾å¦é±è½çã C++大å¦æç¨ï¼ç¬¬äºçï¼ ãã(å¦æ没æCçåºç¡è¿æ¯çè°æµ©å¼ºçCè¯è¨)ãè¿æ¬ä¹¦å¯¹C讲å¾è¿ç®æ¯è¾æ¸ æ°ï¼æå¾å¤ä¹ é¢å¼å¾ä¸åï¼ç¹å«æ¯æåçstructåunion两个é¨åãå ¶ä¸çä¸äºç®æ³æ¯è¾ææ²åç¹çï¼æ¯å¦æ åé¾è¡¨çéåç®æ³ï¼ï¼è¯»è å¯ä»¥å°è¯ä¿®æ¹è¿äºä¾åï¼ä½ä¸ºæå对Cè¯è¨çä¸äºæ»ç»æµè¯ã
梦éï¼è¿ä¸ªé®é¢è®©ææ³èµ·åäºå¹´åçæ å½¢ãä»å¤©å¯¹äºC++æä¸ç¹è®¤è¯ç人ï¼å¤åæ¯ä»é£å å¹´å°±å¼å§å¦C++äºãé£æ¶æ ¹æ¬æ²¡æåçè§å¿µãä»ä¹¦åºéæ¾ä¸æ¬C++书ï¼å¦æççè¿ç®æç½ï¼å°±ä¹°ä¸æ¥ãæè®°å¾é£æ¶åå®å»¶é¿ãå¼ å½éã麦ä¸å¡ææç书é½åå°å¾é«çèµèªãæ个人ææ©çä¸æ¬C++书æ¯Greg Perryçä¸æ¬ä¹¦ï¼ä»å¤©æ³èµ·æ¥ï¼å ¶å®æ¯ä¸æ¬æçC++æå·çCè¯è¨æç¨ã对æä½ç¨æ大çä¸æ¬ä¹¦æ¯å½é²ç§æåºç社åºççä¸æ¬ä¹¦ï¼ä¹¦åè®°ä¸å¾äºï¼ä½è å«æ¯èè¬Â·å¸è±åã
éæï¼è¿è®°å¾ä»¥åæ¾æ¹è¯è¿ä¸æ¬C++书ï¼æ¯åèªåºçï¼æ´æ¬ä¹¦å°±æ²¡æåºç°è¿classå ³é®åãé£æ¬ä¹¦ï¼è¯´ç©¿äºå ¶å®åªæ¯ä»ç»äºCè¯è¨åiostreamåºçç¨æ³ï¼æ ¹æ¬ä¸è½ç®C++ãèå½æ¶æ常常æ¨èçä¸æ¬ä¹¦æ¯çµåç§æ大å¦å¼ æ¾æ¢ èå¸çC++æç¨ãé£æ¬ä¹¦ï¼ç´å°ä»å¤©æ¥çä¹æ²¡æ太大çé®é¢ï¼å¯ä¸ç缺æ¾å°±æ¯ç±äºå¹´ä»£ä¹ è¿ï¼è®¸å¤ä¸è¥¿å·²ç»è¿æ¶äºãè对äºä¸æ¬ææ¯ä¹¦ç±æ¥è¯´ï¼âè¿æ¶âæ¯æä¸å¯æ¥åçã
æ»ä½æ¥è¯´ï¼é£æ¶ä½¿ç¨C++ç人çæ¯å¨âç²äººæ¸è±¡âãä¸è¿è¿ä¹æ好å¤ï¼å°±æ¯å¯¹C++çå¾å¤ç»èè½ææ¸ æ¥ï¼ä»¥åçå°ç»å ¸å¥½ä¹¦æ¶æ¯è¾å®¹æç解ï¼å½ç¶åå¤å°±æ¯æ¦å¿µä¸æ¸ ï¼çè³é½ä¸ç¥éC++åVisual C++ãBorland C++å°åºæä»ä¹ä¸ä¸æ ·ã
梦éï¼æ´ä¸ªå¹´ä»£ï¼å ¶å®å¤§é¨å人对äºC++ç认è¯é½ä¼¼æ¯èéãä¸å¼å§æ¯çåäºBorland C++ï¼åæ¥æ¯çåäºVisual C++åMFCãæ以ä¸è¬æ¥è¯´ï¼æçBCåVCæå·ç书åå¾å¾å¥½ï¼äººä»¬è§å¾è¿å°±æ¯C++ãèææ¯è¾å¹¸è¿ï¼å¸è±åçé£æ¬ä¹¦è½ç¶ä»ç°å¨çç¼å æ¥çè°ä¸ä¸é«è¶ ï¼ä½åºæ¬è·¯åæ¯å¯¹çãå¯è½æ¯å 为å书æ¯ç»UNIXç¨åºåçå¹è®ææï¼æ以没æ让æä¸å¼å§å°±å½¢æâC++ == VC++âç认è¯ã
å ¶å®ä¸ç´å°å¹´ï¼æ们é£éæ计ç®æºçé½æ¯å¯Borland C++马é¦æ¯ç»çï¼å°äºVC 4.0åºæ¥ï¼ä¸ä¸åæ ¼å±å ¨åäºãå¹´VC5æ¨åºä¹åï¼ä¹¦åºéMFC书éºå¤©çå°ï¼å¦MFCç人ï¼å¤´æ¬å¾é½æ¯å«äººé«ä¸äºãä¸è¿ç°å¨çæ¥ï¼é£æ¶å大é¨åçMFC书é½æ¯ä¸æµè´§è²ãææ¾ç»æä¸æ®µæ¶é´è®¤ä¸ºï¼é£ä¸æ¹ç¨åºåä¸é´æä¸å°è¢«è¯¯å¯¼äºãæ ¹æ¬åå å°±æ¯ç¸å¯¹çå°éã
éæï¼æè§å¾ä¸æ¬ä¹¦çä»·å¼æ两æ¹é¢ï¼ç¬¬ä¸ï¼æç»ä½ å®ç¨çææ¯ï¼ç¬¬äºï¼ä¿ä½¿ä½ å»æèã对äºä¸æ¬ä»ç»VCï¼æè 说MFCï¼ä½¿ç¨æ¹æ³ç书ï¼ææ ¹æ¬ä¸å¸æå®è½ä¿ä½¿ææä»ä¹æèï¼æ以æå°±ä¸å®è¦æ±å®å¨ææ¯ä¸ç²¾çæ±ç²¾å®ç¾æ çãæåå¼å§ç¨VCçæ¶åï¼ä¹°ç第ä¸æ¬ä¹¦å°±æ¯æ½ç±æ°èå¸ç¿»è¯çãVCææ¯å å¹ãï¼ç¬¬åçï¼ï¼æ²¡æåå°é£äºâä¸æµè´§è²âç误导ï¼åºè¯¥è¯´æ¯å¾å¹¸è¿çã
梦éï¼å¹´æºæ¢°å·¥ä¸åºç社å¼å§åºçâ计ç®æºç§å¦ä¸ä¹¦âï¼å ¶ä¸çãThinking in C++ã第ä¸çåå°äºå¹¿æ³ç欢è¿ãå ¶å®æä¸ç´ä¸è®¤ä¸ºè¿æ¬ä¹¦å¾åºè²ï¼è½ç¶æ¿è¿ä¸æ¬¡å¤§å¥ãç¶èæ们é½å¾æ¿è®¤ï¼è¿æ¬ä¹¦å¨C++书ç±é¢åé第ä¸æ¬¡å»ºç«äºåçè§å¿µï¼å¾å¤åå¦è å¼å§ç¥éï¼ä¸æ¯é便买åªä¸æ¬é½ä¸æ ·çãåå¾åå°±æ¯å¹´çã æ·±å ¥æµ åºMFCï¼ç¬¬äºçï¼ ã第äºçï¼ä»¥å侯å çå¨ãç¨åºåãä¸å表çé£ä¸ç¯ãC++/OOP大系ãï¼å ä¸æ´ä¸ªå¤§ç¯å¢çååï¼åçè§å¿µæ·±å ¥äººå¿ï¼C++书ç±å¸åºç»äºå¼å§éæ¸ä¸ä¸çåæ¥ã
åæ³å¾äºï¼æçæè§æ¯ï¼é£ä¸ªéè¦ææå ¢å ¢éæ©å ¥é¨ä¹¦çæ¶ä»£å·²ç»è¿å»ï¼ä»å¤©çC++åå¦è ï¼å¤§å¯ä»¥æ¾å¿å°ä¹°å£ç¢å¥½ãèªå·±è¯»èµ·æ¥æ路顺ç ç书ï¼å ¥é¨ä¸åæ¯å¤ªå¤§çé®é¢ãè¿æä¸äºç¨åºåå·²ç»å¦äºå å¹´C++ï¼ä½çå°ä»å¤©åºççä¸äºæ°ä¹¦ï¼æè§æ¯è¾éçï¼è¿ä¹ä¸æ¯ä»ä¹é®é¢ã侯å çç»å¸¸è¯´âå¡èµ°è¿å¿ çä¸è¶³è¿¹âï¼æè°â走弯路âï¼æªå¿ ä¸æ¯ä¸ä»¶å¥½äºã
è³äºå ·ä½çæ¨è表ï¼å°±ä¸å¥½ä¸æ¦è论äºãæ»ä¹å¨æçå°è±¡éï¼ãEssential C++ãããC++ Primerããé±è½ææçC++æç¨ï¼é½ä¸éãçè³æ人ä¸ä¸æ¥å°±çBjarne StroustrupçãThe C++ Programming Languageãï¼åªè¦ä»å欢ï¼ä¹æ²¡ä»ä¹ä¸å¯ä»¥ã
éæï¼æåæä½ çè§ç¹ãä¸ç®¡æä¹è¯´ï¼ç¼ç¨æ¯é¨å®è·µæ§é常强çå¦é®ãè¦æ³å¯¹C++对象模åææ·±å ¥çäºè§£ï¼æ好çåæ³å°±æ¯åä¸ä¸²ç¨åºå»çç»æï¼è¦æ³å¦ä¼OOPï¼ä¹åªè½ä»é¡¹ç®ä¸å¦ã对äºåå¦è ï¼æ好çå¦ä¹ æ¹æ³å°±æ¯ä¸åå°åç¨åºï¼åçæ£æç¨çç¨åºï¼åå°æé®é¢çæ¶åå°±å»æ¥ä¹¦ï¼äºæ¯èªç¶å°±ä¼ç¥éåªæ¬ä¹¦å¥½åªæ¬ä¹¦ä¸å¥½ãä¸è¿æ们çæè²å¶åº¦è½ä¸è½è®©å¤§å¦éçå¦ç们æè¿æ ·çå¦ä¹ æºä¼ï¼æ表示æçã
以æçç»éªï¼å¦C++æ两个é¨æ§ï¼å ¥é¨å使ç¨ãå®å ¨çä¸æC++ï¼è¿æ¯ä¸ä¸ªé¨æ§ï¼ä½æ¯åªè¦æä¸æ¬åéçå ¥é¨ä¹¦ï¼å¾å¿«å°±è½è·¨è¿ãè¦æ³çæ£ç¨ä¸C++ï¼å´ä¸æ¯ä»¶å¾å®¹æçäºæ ãå°¤å ¶å¯¹äºå¦çæ¥è¯´ï¼æ¥è§¦å°çä¸è¥¿å¤æ¯âç©å ·âï¼å¾é¾æå®æçæºä¼ãæ以ç»å¸¸çè§æ人é®âC++å°åºè½åä»ä¹âï¼è¿æ¯C++å¦ä¹ ä¸ä¸ä¸ªæ¯è¾éº»ç¦çé®é¢ãæ们é½æ¯åäºç¸å½é¿æ¶é´çC++ç¨åºä¹åæçå°ä¸äºçæ£ç»å ¸ç书ï¼ä¹æ£æ¯å 为走äºç¸å½é¿ç弯路ä¹åæç¥éè¿äºä¹¦çç»å ¸ä¹æå¨ãæè°å¼¯è·¯ï¼ææ³ä¹æ¯ä¸ç§å¿ é¡»ç积累ãå°±ç®ä¸å¼å§å°±çãEssential C++ãåãC++ Primerãï¼æ²¡æ两ä¸å¹´çæ¶é´ææè¿æ¯é¾ææå¾ã
æ¶éï¼æ两å¥ååæéççè¯ï¼ä¸æ¯æ大å¦çCè¯è¨èå¸è¯´çâåç¨åºä¸å¦è¯´æ¯æç¨åºâï¼å¦ä¸å¥æ¯ä¸ç½å说çâ好ç设计æ¥èªåé´ï¼å¤©æç设计æ¥èªå½çªâã对äºæè¿ä¸ªçæ§æ¹å¤ä¸»ä¹è æ¥è¯´ï¼è¿ä¸¤å¥è¯çç¡®ä¸å¤ªéåãä½æ¯æ 论ä»åªä¸ªè§åº¦æ¥è®²ï¼å¯¹äºåå¦è æ¥è¯´ï¼å½çªå¤§å¸çä½åæ¯éåæåçæå¿«æ·å¾ã
æ个人认为ï¼å¯¹äºC++çåå¦è æ¥è¯´ï¼é¦å è¦ç¡®å®èªå·±ä¸ä¸é¢åå 主è¦ä½¿ç¨çç¹æ§çæ¹åãå 为C++çç¹æ§å¦æ¤ä¼å¤ï¼åå¦è æ³è´ªå¤åºæ¬æ¯ä¸å¯è½æåçãC++çç¼ç¨èå¼åºæ¬å¯ä»¥å为ADT+PPãGPåOOä¸ä¸ªæ¹åã对äºADT+PPèå¼æ¥è¯´ï¼åå¦è ç主è¦é®é¢ä¸æ¯å¦ä¹ C++ï¼èæ¯å¦ä¹ Cç使ç¨ã对äºè¿æ ·çåå¦è ï¼å½å çå æ¬ä¹¦è¿æ¯åå¾æ¯è¾æ¸ æ¥ï¼ç¬¦åä¸å½äººçä¹ æ¯ï¼æ¯å¦è°æµ©å¼ºçãCè¯è¨æç¨ããé±è½çãC++è¯è¨å¤§å¦æç¨ããè¿ä¸¤æ¬ä¹¦æé¦æ¨ç¬¬ä¸æ¬ï¼å 为è¿ä¸æ¬ææ½å¿ç 究äºä¸å¹´ï¼è¿æ¬ä¹¦å½ä¸å¾å¤ç¨åºæ¯å¯ä»¥å½çªçï¼èä¸å¯ä»¥å¯¹è¿äºç¨åºè¿è¡å å·¥åæåãæ¯å¦ç»æè¿ä¸ç« ä¸ï¼å®æç»åºçç¨structæ¥å®ç°é¾è¡¨ãäºåæ çç®æ³æ¯ç¸å½è¹©èçãå¦ä¹ ADT+PPçåå¦è å°è¿æ¬ä¹¦æ£æ©é以åå¯ä»¥å°è¯ä¿®æ¹è¿ä¸¤ä¸ªç¨åºãå¦å¤è¿æ¬ä¹¦ç第äºçç¨å¾®æ¶åäºä¸äºå ³äºâç±»âçå 容ãå¦ä¹ ADT+PPçåå¦è ï¼å¯ä»¥ä¸è¢«OOä¸çä¸äºä¸æç¹æ§æ°ä¹±èªå·±çæè·¯ï¼å¯¹äºç±»å±æ¬¡æå¹³ãæ 继æ¿ãæ å¤æçç¨åºç¼åæ¯æå¾å¤§å¥½å¤çã
éæï¼ä½ 好象æ¯è¾æ¨å´å½å ææåç书ãç°å¨ç¤¾ä¼ä¸æç§ä¸å¥½çé£æ°ï¼ä¸æ§å°±æ§ä¸å¤©ï¼ä¸è´¬å°±è´¬ä¸å°ãå°±å¥½è±¡å¯¹å¾ è°ææç书ï¼åå å¹´æ¯å¥ä¸ºç»å ¸ï¼è¿å å¹´åæå¾å¤äººä½¿å²æ¹è¯ãå¦C++æ´æ¯æç¹âå´æ´åªå¤âï¼æ»æ¯è§å¾åå¦å°±åºè¯¥çãEssential C++ããæçè¿ç§è§ç¹ä¹æ¯çé¢çã
æ¶éï¼å½ç¶ãEssential C++ãä¹å¼å¾ççãä½æ¯æ个人è§å¾è¿æ¬ä¹¦æ²¡æè°æµ©å¼ºçãCè¯è¨æç¨ãæ¥å¾å¥½ã主è¦åå æ¯ï¼ç¬¬ä¸ï¼C++çææç¹æ§é½ç¹å°äºï¼ä½æ¯ä¸æ·±ï¼çäºä»¥åä¼ä¸å¿äºæ没ææ¹åï¼ç¬¬äºï¼å¯ä»¥æè¢åé´çä¾å太å°ããCè¯è¨æç¨ãä¸æå¾å¤æ趣çé®é¢ï¼æ¯å¦ç´ååæ¡ãæ±è¯ºå¡ççï¼è¿äºä¾å对äºååæ¶åC/C++è¯è¨ç¼ç¨ç人æ¥è¯´æ¯å¦ä¹ ç¼ç¨å¾å¥½çä¾åããEssential C++ãåªè½æ¯å两æ¬ä¹¦çé以åï¼ä½ä¸ºå¦ä¹ C++ç¹æ§çä¸ä¸ªè¿æ¸¡æ§ç书ç±ã让读è çæ£é¢ç¥å°ä»ä¹æ¯C++çç¼ç¨ãåCç¼ç¨çä¸åç¹å¨åªéã
éæï¼æåç°ä¸ä¸ªå¾æ趣çç°è±¡ï¼åå¦è å¾å¾å欢é®âåªæ¬ä¹¦æ¯è¾å¥½âï¼è¿è®©æå¾æ¯ä¸è§£ãè¿æç¹åä¸ä¸ªåå¦æ篮çç人é®âçæ²»é åç§æ¯è°æ¯è¾å害âãå½ç¶ç§æ¯æ´å害ä¸äºãä½å¦æä½ æ¯æ³å¦æ篮çï¼è¿ä¸¤ä¸ªäººé½é常é常æèµæ ¼æä½ ï¼ä½ è·è°å¦é½è½å¦å¾å¾å¼ºââå ³é®ä¸æ¯å¨äºä½ éåªä¸ªèå¸ï¼èæ¯å¨äºä½ èªå·±ç¨å¤å°å夫å»å¦ã
éæï¼åå°åæ¥è¯é¢ãå¦ä¼äºC++çè¯æ³ï¼è½çæC++代ç ä¹åï¼å¿ é¡»æäºä¹¦æ¥æ导è¿é¶ï¼æè å«æç¹è¿·æ´¥ï¼ãæè§å¾ã设计模å¼ãå¾å¥½ï¼è½å¤è®©è¯»è çå°ä¸äºç²¾å¦çç¨æ³ãä¸è¿æ£å¦æç»å¸¸è¯´çï¼æ¨¡å¼å¸¦æ¥ç麻ç¦å好å¤ä¸æ ·å¤ï¼çè³éº»ç¦è¿è¦æ´å¤ãèä¸ï¼C++æ¬èº«çé®é¢ä½¿å¾å¨C++ä¸ä½¿ç¨GoF模å¼æå 麻ç¦ã
梦éï¼ãDesign Patternsãè¿æ¬ä¹¦ç»å¯¹æ¯ä¸å¯ä»¥æ²¡æçï¼èä¸ä¸è±æçé½ä¸å¯å°ãæåæçä¸æçï¼è¯´å®è¯çä¸æï¼ä½æ¯ä¹ä¸è§å¾äººå®¶ç¿»è¯å¾ä¸å¥½ï¼æ以就æ³ï¼å¤§æ¦æ¯åæå°±å¾é¾æï¼å ä¸èªå·±æ°´å¹³æéãäºæ¯æ»æ¯æ³çåæ¾å æ¬patternsç书æ¥çãåæ¥æ¾å°å æ¬ä¹¦ï¼å£ç¢è¿ä¸éï¼ä¸è¿æ°´å¹³é«ä¸ï¼ä¸æ¯å°±åºæ¥äºï¼è¿æ¯é£æ¬ãDesign Patternsãæç»å ¸ï¼æèçãè±æçåºæ¥ä¹åï¼ä¸¤ä¸ªçæ¬å¯¹ç §çï¼æç½å¤äºãç°å¨è§å¾ï¼å ¶å®å°±è®¾è®¡æ¨¡å¼æ¥è®²ï¼æè¿æ¬çæç½äºå°±å¾ä¸éäºï¼ä¸ç¨åè±è´¹å¾å¤å¿ææ¾å ¶ä»ç书ãæç°å¨çå éå§ç»å¤¹çè¿æ¬ä¹¦ï¼é身æºå¸¦ï¼æå¤æ æ£ã
è³äºè¯´è®¾è®¡æ¨¡å¼çå¯ä½ç¨ï¼åå¯è½å¸¦æ¥çå¼ç«¯ï¼æçä½ä¼ä¹æºå¤ãä¸è¿æ¯è¿æ ·ï¼æ们æ³ä¸æ³ï¼ç©¶ç«ä»ä¹æ åµä¸è®¾è®¡æ¨¡å¼å¯ä»¥ç¨å¾å¾å¥½å¢ï¼ä¸ç§æ¯æç»éªä¸°å¯ç人å¼å¯¼ï¼æ¯å¦è¦æ¯Robert Martin带éï¼ä½ å¨æ个å°æ¹ç¨éäºè®¾è®¡æ¨¡å¼ï¼ä»å°±ä¼æåºæ¥ï¼è¯´è¿éä¸å¯¹ï¼å°æ¥ä¼äº§çä»ä¹æ ·çå¼ç«¯ã对äºä»æ¥è¯´ï¼ä¸°å¯çå®è·µç»éªè¶³ä»¥æ¯æä»è¿è¡âé¢æµåâ设计ãä½æ¯å¤§é¨å人没è¿ä¸ªè½åï¼å æ¤æ们åªå¥½èµ°ç¬¬äºæ¡è·¯å第ä¸æ¡è·¯ï¼å°±æ¯âè¯æ¢åâ设计åâéæåâ设计ãéå°ä¸ä¸ªé®é¢ï¼ä½ è§å¾ç¨æç§æ¨¡å¼æºåéçï¼å°±å¤§èå°ç¨äºï¼æåæ¯ç§¯ç´¯ç»éªï¼åç°ä¸å¥½ï¼åºäºé®é¢äºï¼åªå¥½æ¹åæ¥ï¼é£ä¹æ¯ç§¯ç´¯æè®ãè¿å«åâè¯æ¢åâãè³äºéæï¼åºè¯¥ç®æ¯ææç»ç»ãæåçæé«çå·¥ç¨åæ¹æ³ãå æé®é¢âquick and dirtyâå°è§£å³äºï¼ææçæç¤é½æ´é²åºæ¥ï¼ç¶ååæ ¹æ®å®é æ åµéç¨åéç模å¼ä¼å设计ãç°å¨XPåUPé½é«åº¦éè§refactoryï¼UPå¨ElaborationåConstructioné¶æ®µé½é¼å±æ½åºä¸é¨çiterationsè¿è¡éæãæ以说å¦æç»ç»å¿«éç软件å¼åï¼å½ç¶æ¯è¾å¾åäºè¿æ¡è·¯ââææåçåã
éæï¼è®²å°éæï¼æ顺便说说ãRefactoringãè¿æ¬ä¹¦çå½±åãä»å·¥ç¨æ¬èº«çè§åº¦æ¥è¯´ï¼ä½ æè°çâéæå设计âæ¯æ²¡æä»ä¹é®é¢çãä½ä¸å½çå¼åè ï¼ä¹å æ¬æå¨å ï¼å¾å¾æ¯è¾å²å¨ï¼æ¯è¾å®¹æç¸ä¿¡é¶å¼¹çåå¨ãæ¾ç»æé£ä¹ä¸æ®µæ¶é´ï¼æå¨Javaä¸å°è¯è¿äºéæçæ¹æ³ä¹åï¼åæ¿å°C++ä¸å»å°è¯ãç»æåç°ï¼å¨Javaä¸é度é常快çéæè¿ç¨ï¼å°C++ä¸å°±è¢«åæ ¢äºãç©¶å ¶åå ï¼å°±æ¯å 为C++åJavaç约ææ¡ä»¶ä¸åãæ¿çJavaä¸æåçæ¡ä¾ç´æ¥å¥C++ï¼ä¸å¤±è´¥ææªã
æ以ï¼æå¿ é¡»è¯´ï¼ãRefactoringãè¿æ¬ä¹¦å¾æä»·å¼ãä½å¯¹äºC++ç¨åºåæ¥è¯´ï¼å®çä»·å¼æ¯è®©ä½ æèï¼æèè¿ç§æ¹æ³çå¯è¡æ§ãå¦æä¸ä¸ªC++ç¨åºå没ææç®è¿ç§»å°Javaï¼é£ä¹æå¿ é¡»åè¯ä»ï¼ãRefactoringãè¿æ¬ä¹¦ä¸æ¯è®©ä½ ç §çå®ç¨çï¼çè³ä¸æ¯è®©ä½ å»ç¸ä¿¡å®çã对äºC++ç¨åºåï¼ãRefactoringãå ¨ä¹¦å¯ä»¥æ¾å¿ç¸ä¿¡çåªæç¬¬ç« ï¼å ¶ä»çé¨åï¼é½å¿ é¡»é常谨æ å°å¯¹å¾ ã
梦éï¼æè¿è¦å°±âè¯æ¢åâçæ¹æ³å¤è¯´ä¸¤å¥ï¼æè§å¾å¯¹äºä¸ªäººåå±æ¥è®²ï¼âè¯æ¢âä¹æ¯å¿ ä¸å¯å°çï¼æå¢ä¸å¯æï¼é«æ°´å¹³ç人ä¸é½æ¯æåºæ¥çåï¼ä½ 失败äºä¸æ¬¡ï¼å°±ç¥éè¿ä¸ªæ¨¡å¼æä»ä¹æ½å¨çé®é¢ï¼ä¸æ¬¡åç¨ï¼å°±ä¼å¤çå æ¥ï¼åä¸æ£ä¼¼çãæçå¤äºï¼è·¯æ°å°±åºæ¥äºã
æä¸ç¥éä½ ä»¬æ¯å¦æè¿ä¸ªæè§ï¼ç¨éäºæ¨¡å¼ï¼åäºäºï¼ååè¿å¤´å»ç¿»ç¿»ãDesign Patternsãï¼çå°äººå®¶æ©å°±æåºæ¥è¿ä¸ªé®é¢ï¼ä¸è¿å°±æ¯é£ä¹å å¥è¯ï¼åæ¥çä¸å»å¹²å·´å·´çï¼ç°å¨è§å¾å¥å¥é½è®²å°å¿åä¸ï¼GoFç形象马ä¸å°±é«å¤§èµ·æ¥ï¼è¿å¸¦çå ç¯ï¼æè§æ¯æ¢å ´å¥åææã
éæï¼ç°å¨å头æ¥çï¼ææ´æ¬£èµmyanæ¨èç»æçãDesigning Object-Oriented C++ Applications Using Booch Methodããè¿æ¬ä¹¦è½å¤å¸®å©C++ç¨åºåçæ¸ æè·¯å¹å »ä¹ æ¯ï¼å¯æå½å 没æå¼è¿ãç¸æ¯åæ¥åä¸å³æµåçUMLç³»å书ç±ï¼æè§å¾è¿æ¬ä¹¦å¯¹äºé¢å对象çééç²¾è¾ç¬å°ï¼è³ä»æªæè½åºå ¶å³è ã
梦éï¼åææ们两人é½è¯´å°Robert Martinï¼ä»å¯æ¯æçæ¦æ ·ãé£æ¬å¹´çãDesigning Object Oriented C++ Applicationãï¼æè§å¾æ¯æ¯ä¸ä¸ªC++软件工ç¨å¸é½åºè¯¥åå¤ç 读ç书ãå¯æä¸ä» å½å 没æå¼è¿ï¼å¨å½å¤çåæ°ä¹ä¸å¤§ãå¦æä½ è§å¾é¢å对象çé£äºéçä½ å¥½åé½æç½ï¼å¯å°±æ¯ä¸éå°å®é é®é¢å°±ä½¿ä¸ä¸å²ï¼é£è¿æ¬ä¹¦å°±æ¯ä½ çæ佳导å¸ã
æå°çæ¸ æè·¯ï¼è¿æä¸æ¬ä¹¦ä¸å¾ä¸æï¼å°±æ¯Andrew KoenigçãRuminations On C++ããæ¯ä¸ªäººé½åºè¯¥é®èªå·±ï¼æå¦äºè¿ä¹å¤å¹´çC++ï¼ç©¶ç«ä»ä¹æ¯C++æåºæ¬ç设计ç念ï¼éå°é®é¢æ第ä¸ä¸ªç´è§æ¯ä»ä¹ï¼ç¬¬ä¸ä¸ªè¯æ¢åç解å³æ¹æ¡åºè¯¥å ·æé£äºç¹ç¹ï¼å¦æä½ ä¸è½ç»åºæç¡®ççæ¡ï¼å°±åºè¯¥è®¤çå°å»è¯»è¿æ¬ä¹¦ï¼è¯»å®äºä½ å°±æäºâ主å¿éª¨âã
éæï¼æä¸å¥è¯ï¼è°è°âæ¨è书âçé®é¢ãå ¥é¨ä¹¦åºæ¬ä¸æ¯æ¾ä¹åæµ·èçåçï¼æ以æ¨èçæä¹ä¹ä¸å¤§ãèå ¥é¨åçåå±æ¹åï¼æ¯ä¸ªäººä¸åï¼è¿ä¸ªæ¶åå°±éè¦âé«äººâçæç¹ã举个ä¾åï¼æå¦C++çæ¶åï¼myanè¿ä¸è®¤è¯æï¼æ以ä¹æ²¡æç»ææ¨è书ï¼æè¿æ¯å¦è¿æ¥äºï¼æ以å³ä½¿ä½ å½æ¶åææ¨èäºãEssential C++ãæè ãC++ Primerãï¼æä¹ä¸ä¼å¤ªæè°¢ä½ ï¼ä½å¨æ认çç 究OOçæ¶åï¼ä½ æ¨èRobert Martiné£æ¬ä¹¦ç»æï¼å¯¹æ帮å©å°±ç¹å«å¤§ï¼èä¸æä»å«çå°æ¹ä¹å¾é¾æ¾å°ç±»ä¼¼çæ¨èï¼æ以æå°±å¾æè°¢ä½ ã
ä¸ä¸ªç¨åºåï¼å¿ é¡»æframeworkçæè¯ï¼è¦å¦ä¼ç¨frameworkï¼è¿è¦ä¸»å¨å»åæframeworkï¼å¨è¿æ¹é¢ï¼ãDesign Patternsãè½æä¸å®ç帮å©ï¼ãä½æ¯ï¼çæ£é«è´¨éãææ°åçframeworkç书ææä¹å°±åªæé对MFCçãä»è¿ä¸ªè§åº¦æ¥è¯´ï¼MFC纵æåè¬ä¸æ¯ï¼C++ç¨åºåé½é常æå¿ è¦å å»ç¨å®ãçæå®ãç 究å®ï¼çè³åå©ãæ·±å ¥æµ åºMFCãè¿æ ·ç书æ¥åæå®ãä¸ç¶ï¼å¾é¾æframeworkçæè¯åæè§ã
å½ç¶ï¼å¦ä¸ä¸ªframeworkä¹å¾å¥½ï¼é£å°±æ¯STLãä¸ç®¡ç¨ä¸ç¨MFCãSTLï¼å¯¹è¿ä¸¤ä¸ªä¸è¥¿çææ¡åç解é½æ¯ææ帮å©çãæè¿æåå¨çãæ·±å ¥æµ åºMFCãï¼è½ç¶å·²ç»ä¸ç¨MFCç¼ç¨äºï¼ä½å¸®å©æ¯ä¸å®æçã
梦éï¼MFCåSTLæ¹é¢ï¼æè¿æ¯æ¯è¾æ¨å´ä¾¯å çç两æ¬ä¹¦ãæ·±å ¥æµ åºMFCãåãSTLæºç 解æãã
ãæ·±å ¥æµ åºMFCãè¿æ¬ä¹¦ï¼åæ°èªç¶æ¯å¤§å¾ä¸å¾äºï¼ä¸è¿ä¹æä¸å°äººæ¹è¯ãå ¶å®ä¹¦ä¹æ²¡æåå ¨åç¾çï¼æ¹è¯å½ç¶æ¯å°ä¸äºçï¼ä¸è¿æçæ¶åæçå°æ人è¯è®ºè¿æ¬ä¹¦ï¼æå®è·Inside VCç¸æ¯ï¼ççæ¯ç头ä¸å¯¹é©¬å´ã
ä½ åæå ¶å®è¯´å¾å¾å¯¹ï¼ç¨åºååºè¯¥æä¸ç¹frameworkæè¯ãèè¿æ¬ãæ·±å ¥æµ åºMFCãä¸å ¶è¯´æ¯å¨è®²MFCç¼ç¨ï¼ä¸å¦è¯´éç¯æ¯å¨æ¿MFC为ä¾åæApplication Frameworkçæ¶æåèç»ãæ以æ è®ºä½ å¯¹äºMFCæ¬èº«æ¯ä»ä¹æ度ï¼è¿æ¬ä¹¦å¯¹æ¯ä¸ä¸ªC++ç¨åºåé½æå¾å¤§ççå¤ã
éæï¼æ¯çããVCææ¯å å¹ãä¼åè¯ä½ âDYNAMIC_CREATEè¿ä¸ªå®æä¹ç¨âï¼ãæ·±å ¥æµ åºMFCãååè¯ä½ âDYNAMIC_CREATEè¿ä¸ªå®æ¯æä¹å®ç°çâãæ以ï¼å¦æä½ åªéè¦å¨VCä¸åä¸äºå°åºç¨ç¨åºï¼ãæ·±å ¥æµ åºMFCãçä»·å¼å¹¶ä¸å¤ªå¤§ï¼ä½æ¯ï¼å¦æä½ éè¦è®¾è®¡ä¸ä¸ªç¨å¾®å¤§ä¸ç¹çä¸è¥¿ï¼ä¸ä¸å®æ¯frameworkï¼ï¼MFCç设计ææ³å°±ä¼ææ帮å©ã
梦éï¼å¦å¤ï¼æè§å¾å¯¹äºMFCä¹åºè¯¥æä¸ä¸ªå ¬å çè¯ä»·ãè¿å»æ¯å¹æ§å¾å¤©ä¸æå°ä¸æ ï¼ä¹¦åºééºå¤©çå°é½æ¯MFCç书ï¼æå¾å¤§å®¶åªç¥æMFCï¼ä¸ç¥æC++ï¼çè³ç´å°ç°å¨è¿æ人é®ï¼âææ¯å¦MFCå¢ï¼è¿æ¯å¦C++ï¼VC++æ¯ä¸æ¯æ¯C++æ´é«çº§çè¯è¨ï¼âMFCæäºä¸å°ç¥åï¼é»ç¢äºäººä»¬çè§çº¿ãæ以å¾æå®ä»ç¥åä¸æä¸æ¥ãè¿å°±æ¯è¿å»ä¸ä¸¤å¹´æå¾å¤äººï¼å æ¬æå¨å æ¹è¯MFCçä¸ä¸ªç®çãå¯æ¯ç°å¨å¤§å®¶è§éå¼éäºï¼.NETä¹åºæ¥äºï¼MFCä¸åæ¯ç¥åäºï¼å°æ°äººå°±å¼å§ä»¥è´¬æMFC为ä¹äºãæè§å¾è¿ç§æ度æ¯ä¸å¯¹çã
ä»ä¹å«å¥½çæ¡æ¶ï¼æè§å¾å¨åå å¹´çæ¶é´è½å¤è±¡MFCè¿æ ·ä¿æ稳å®å¹¶ä¸ä¸æè¿æ¥çæ¡æ¶å°±æ¯å¥½çæ¡æ¶ãå¯è½æ们å¨ä¸äºå ·ä½ç设计é®é¢ä¸æä¸åçæ³ï¼è§å¾âè¿ä¸ªå°æ¹è¿ä¹è®¾è®¡ä¸æ¯æ´æ¼äº®åï¼âå¾å¤æ¶åæ¯çï¼ä½æ¯è¿ä¸éè¦ï¼éè¦çæ¯MFCæç稳å®ãæåå å¹´çæåç»éªï¼è¿æ¯æäºä¸èµ·çä¸è¥¿ã
å¦å¤ä¸ç¹ï¼MFCä¸é´å æ¬çå¦ä¹ Win APIç¼ç¨çæä½³èµæãè¿æ¯é¤äºå ¶frameworkæ¹é¢ä¹å¤çå¦ä¸ä¸ªäº®ç¹ãæç°å¨ä½¿ç¨Win APIå¼åï¼ä½æ¯ç»å¸¸åèMFCçæºä»£ç ï¼æ¶è·å¾å¤§ã
éæï¼STLæ¹é¢ï¼æ对äºåæå®çæºä»£ç å ´è¶£å¹¶ä¸å¤§ï¼æ¯ç«éé¢æºä»£ç å¤æ¯ç®æ³é®é¢ãæ以ï¼ãSTLæºç åæãæä¹åªæ¯é便翻翻就æä¹é«éäºãæè§å¾è¿æ¬ä¹¦ç¨æ¥å计ç®æºç³»çæ°æ®ç»æåç®æ³ææä¸éï¼ä¸ç¥éæ没æèå¸ä¹æè¿æ ·åã
对äºSTLï¼æçæ度ä¸åé½æ¯âåºç¨è³ä¸âãä¸è¿ï¼æä¸ç´è®¤ä¸ºSGI STLæ¬èº«å°±æ¯ä¸æ¬ç²¾å½©ç书ï¼ä¸æ¬æ°æ®ç»æåç®æ³çç»å ¸åè书ï¼åæ¶ä¹æ¯æ³åææ¯çåè书ãæ³ç¥éä¸ä¸ªç®æ³æ¯å¦ä½å®ç°çï¼ççSTLæºä»£ç å°±è¡ï¼æ³ç¥éå¦ä½ä½¿ç¨type traitsï¼STLæºä»£ç éé¢ä¹æä¾åãçå«äººåç书ï¼æ»è§å¾éçä¸å±çº±ï¼æç¹æ ä¸å°çå¤çæè§ãSGI STLç代ç åå¾é常æ¼äº®ï¼ä¸ä¸ªC++ç¨åºåå¦æä¸ççè¿æ¬ä¹¦ï¼å®å¨æ¯å¯æã
梦éï¼è³äºSTLï¼é¤äºãSTLæºç 解æãä¹å¤ï¼æ举贤ä¸é¿äº²ï¼å¼ºçæ¨è侯å çä¸æåè¯çé£æ¬ãThe C++ Standard Libraryããè¿æ¬ä¹¦è´¨éä¹é«æ¯æ éæççãæç°å¨æ边常å¤æ¤ä¹¦ï¼éæ¶æ¥é ï¼å¯¹æ帮å©å¾å¤§ã
éæï¼C++åJavaç¸æ¯ï¼æ大çä¼å¿å°±æ¯å®æ²¡æä¸ä¸ªä¸é¨çå ¬å¸æ¥ç®¡å®ï¼æ大çå¼±ç¹ä¹æ¯å®æ²¡æä¸ä¸ªä¸é¨çå ¬å¸æ¥ç®¡å®ãJavaç¨åºåå¨å¦ä¼ç®åçè¯æ³ä¹åï¼ç«å»è¿å ¥SUNæä¾çframeworkï¼ä¸è¾¹ç¨è¿ä¸ªç°æçframeworkåå®é å¼åï¼ä¸è¾¹å¨å¼åè¿ç¨ä¸ç»§ç»å¦ä¹ Javaä¸äºå¹½æ·±çç¹æ§ãèè¿ä¸ªæ¶åï¼C++ç¨åºåææè¿å¨é®âVCåBCBåªä¸ªå¥½âå¢ãè¿æ çæ¯æµªè´¹æ¶é´ã
梦éï¼åæä½ è¯´JavaåC++çä¼å£ï¼è¿ä¸ªè¯é¢å·²ç»æäºæ们è¿ä¸ªå¹´ä»£æ°¸ä¸æ¶å¤±ç声波äºãæä¹ä¸æ³åè°è¿ä¸ªãä¸è¿æä¸ç¹æå¾è¯´æ¸ æ¥ï¼ç°å¨æ们å¾å¤ç¨C++ç人åäºä¸å°è¦å¤´ï¼æ¢è¿èåå»ççJavaï¼è§å¾å®çæ¯å¤ªå¯ç±äºï¼è¿ç§å°è±¡æ¯ä¸åç¡®çãå¦å¤ï¼Javaä¹ä¸ç®åï¼èä¸ä¼è¶æ¥è¶åºå¤§å¤æãå¨å¾å¤åºåï¼Javaè¿ä¸å ·æç«äºåãè³äºå°æ¥å¦ä½ï¼æçæäºJavaç±å¥½è ä¹è¿åä¹è§äºï¼ä¼¼ä¹è®¡ç®æºç§å¦çå å年解å³ä¸äºçé®é¢é½å¯ä»¥åçJavaçä¸é£è§£å³æï¼ææ没é£ä¹å®¹æã
éæï¼é£å½ç¶ãæå次强è°ï¼No Silver Bulletã读书å¾éè¦ï¼ä½å¤äººè¯´âè¡ä¸éè·¯ï¼è¯»ä¸å·ä¹¦âï¼è¿æ¯æâè¡è·¯âæ¾å¨â读书âåé¢ãå°¤å ¶å¯¹äºææ¯ä¹¦ç±ï¼å¦æå®ä¸è½å¸®æ解å³é®é¢ãä¸è½ç»æ带æ¥é常å®é çå©çï¼é£ä¹ææ¯ä¸ä¼å»è¯»å®çãæ¶é说å¾å¯¹ï¼æ们è¿ä¸ªç¤¾ä¼å¾å¿«é¤ï¼æ们è¿ä¸ªè¡ä¸å°¤å ¶å¾å¿«é¤ï¼æ们ä¹åªè½åªåéåºå®ã
为什么 MyBatis 源码中,没有我那种 if···else
在 MyBatis 源码中,设计模式的巧妙使用是整个框架的精华,共有约种模式,包括创建型、结构型和行为型模式。
创建型模式包括工厂模式、单例模式和建造者模式。工厂模式用于创建 SqlSessionFactory,单例模式确保 Configuration 的唯一实例,建造者模式将 XML 文件解析到对象中。
结构型模式有适配器模式、代理模式、组合模式和装饰器模式。适配器模式使接口不兼容的对象可以协作,代理模式提供 DAO 接口的实现,组合模式用于 SQL 标签组合,装饰器模式允许在不修改结构的情况下增加行为。
行为型模式包括模板模式、策略模式和迭代器模式。模板模式定义算法框架,策略模式允许算法的替换,迭代器模式遍历集合元素。
总结,MyBatis 源码运用设计模式解决复杂问题,合理切割子问题,学习这些方案技术能提高对设计和实现的理解,扩展编码思维,积累经验,成为优秀工程师和架构师。
2024-12-23 06:39310人浏览
2024-12-23 06:242249人浏览
2024-12-23 05:091950人浏览
2024-12-23 04:50543人浏览
2024-12-23 04:431392人浏览
2024-12-23 04:422334人浏览
我國拳后林郁婷在奧運女子拳擊57公斤級4強賽,以5比0強壓土耳其對手,成功闖入金牌戰,已經創下台灣拳擊史上新歷史,距離自己的金滿貫也差最後一面金牌。林郁婷的媽媽心疼她身陷風波,透露自己已經好幾天都睡不
1.「安卓按键精灵」扒别人脚本的界面源码2.Metersphere 源码启动并做性能测试一)3.Android 手机自动化测试工具有哪些?「安卓按键精灵」扒别人脚本的界面源码 下午讨论中,群友询问
1.VB.NET使ç¨OracleTransactionå¤çäºå¡VB.NET使ç¨OracleTransactionå¤çäºå¡ æ°æ®åºäºå