写代码犹如写文章

  本书中Bob大叔提倡”写代码犹如写文章“,又说道“大师级程序员把系统当故事来讲,而不是当做程序来写”,对此观点我印象深刻!在此之前我从未听说过可以把代码当成故事、文章来写,Bob大叔太有才了! 
   
  如何才能写出整洁代码呢?总的原则无非是KISS(Keep It Simple Stupid):让代码简单直接,让阅读者可以很容易地看出设计者的意图。本书中给出了很多方法与规范,遵循这些规则可以帮你写出更加的整洁代码。 
   
  这是一本不错的书。给本书打4星,是因为本书在讲述代码重构方面不如《重构--改善既有代码的设计》、讲述代码编写方面不如《代码大全》、讲述代码设计方面不如《敏捷软件开发》(Bob大叔自己的上一本经典著作)。另外中文版价格偏高,翻译质量也很一般。 
   
  读书笔记: 
  第一章 整洁代码 
  1,整洁代码力求集中,每个函数、每个类和每个模块都全神贯注于一件事。 
  2,整洁代码简单直接,从不隐藏设计者的意图。 
  3,整洁代码应当有单元测试和验收测试。它使用有意义的命名,代码通过其字面表达含义。 
  4,消除重复代码,提高代码表达力。 
  5,时时保持代码整洁。 
   
  第二章 有意义的命名 
  1,使用体现本意的命名能让人更容易理解和修改代码。 
  2,编程本来就是一种社会活动。 
  3,尽力写出易于理解的代码 
   
  第三章 函数 
  1,一个函数应该只做一件事(高内聚),无副作用。 
  2,自顶向下阅读代码,如同是在阅读报刊文章。 
  3,长而具有描述性的函数名称,好过描述性的长注释。 
  4,少用输出参数。 
  5,拒绝boolean型标识参数。 
  例: CopyUtil.copyToDB(isWorkDB) --> CopyUtil.copyToWorkDB(), CopyUtil.copyToLiveDB()
  6,使用异常代替返回错误码,错误处理代码就能从主路径代码中分离出来得到简化。 
  7,写代码很像是写文章。先想怎么写就怎么写,然后再打磨:分解函数、修改名称、消除重复。 
  8,编程其实是一门语言设计艺术,大师级程序员把程序系统当做故事来讲。使用准确、清晰、富有表达力的代码来帮助你讲故事。 
   
  第四章 注释 
  1,别给糟糕的代码加注释----重写吧。 
  2,把力气花在写清楚明白的代码上,直接保证无需编写注释。 
  3,好的注释: 
  法律信息 
  提供信息 
  解释意图 
  警示 
  TODO注释 
   
  第五章 格式 
  1,代码格式很重要。代码格式关乎沟通,而沟通是专业开发者的头等大事。 
  2,向报纸格式学习代码编写。 
   
  第六章 对象和数据结构 
  1,对象把数据隐藏于抽象之后,只提供操作数据的函数。 
  数据结构暴露其数据,没有提供有意义的函数。 
  2,The Law of Demeter:模块不应去了解它所操作的对象内部细节。 
   
  第七章 错误处理 
  1, 使用异常而非返回错误码. 
  2, try-catch-finally, log出错信息. 
  3, 不要返回null,不要传递null。 
  NULL Object模式, 例:Collections.emptyList(); 
   
  第十章 类 
  1,自顶向下原则:让程序读起来就像是一篇报纸文章。 
  2,method可以是protected,以便于单元测试。 
  3,SRP:类或模块应有且仅有一个加以修改的原因。类名应准确描述其职责。高内聚。 
  4,开放闭合原则OCP、依赖倒置原则DIP 
  5,变量名、方法名、类名都是给代码添加注释的一种手段。 
   
  第十二章 迭代前进 
  1, 紧耦合的代码难以编写单元测试。 
  2,单元测试消除了对清理代码会破坏代码的恐惧。 
  3,写出自己能理解的代码很容易,软件项目的主要成本在于长期维护。 
  4,代码应当清晰表达其作者的意图;测试代码可以通过实例起到文档作用。 
   
  第十四章 逐步改进 
  1,编程是一种技艺。要编写整洁代码,必须先容忍脏代码,然后清理! 
  2,写出好文章就是一个逐步改进的过程。
### 回答1: 以下是使用STM32作为USB Mass Storage设备进行读的示例代码: 首先需要在STM32中启用USB功能,并将其配置为Mass Storage设备。这个过程需要使用STM32的固件库或者第三方USB库进行实现,具体方法可以参考相关文档或者教程。 在配置好USB Mass Storage设备之后,可以使用以下代码进行读: ```c #include "usbh_core.h" #include "usbh_msc.h" USBH_HandleTypeDef hUSBHost; // USB主机句柄 MSC_HandleTypeDef hMSC; // Mass Storage设备句柄 /* USB Host库回调函数,用于处理Mass Storage设备的连接和断开事件 */ void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id) { switch(id) { case HOST_USER_SELECT_CONFIGURATION: break; case HOST_USER_DISCONNECTION: break; case HOST_USER_CLASS_ACTIVE: /* Mass Storage设备已经连接并且准备就绪 */ USBH_MSC_UnitReady(&hUSBHost, &hMSC); break; default: break; } } /* 读取数据 */ void read_data() { uint8_t buffer[512]; uint32_t sector = 0; // 起始扇区 uint16_t count = 1; // 扇区数目 /* 读取数据 */ if(USBH_MSC_Read(&hUSBHost, &hMSC, buffer, sector, count) == USBH_OK) { /* 读取成功 */ // 处理读取到的数据 } else { /* 读取失败 */ // 处理错误 } } /* 入数据 */ void write_data() { uint8_t buffer[512]; uint32_t sector = 0; // 起始扇区 uint16_t count = 1; // 扇区数目 /* 填充数据 */ // ... /* 入数据 */ if(USBH_MSC_Write(&hUSBHost, &hMSC, buffer, sector, count) == USBH_OK) { /* 入成功 */ // 处理成功 } else { /* 入失败 */ // 处理错误 } } int main() { /* 初始化USB Host库 */ USBH_Init(&hUSBHost, USBH_UserProcess, 0); /* 连接Mass Storage设备 */ USBH_RegisterClass(&hUSBHost, USBH_MSC_CLASS); USBH_Start(&hUSBHost); /* 等待Mass Storage设备连接 */ while(USBH_GetState(&hUSBHost) != HOST_CLASS) { USBH_Process(&hUSBHost); } /* 获取Mass Storage设备句柄 */ hMSC = *(MSC_HandleTypeDef*)hUSBHost.pActiveClass->pData; /* 读取数据 */ read_data(); /* 入数据 */ write_data(); /* 断开Mass Storage设备 */ USBH_Stop(&hUSBHost); } ``` 需要注意的是,在读数据之前,需要先连接Mass Storage设备并获取其句柄。另外,具体的读操作也需要根据设备的具体实现进行调整。 ### 回答2: STM32 USB Mass Storage (USB MSD) 设备的读代码如下: 首先,在 STM32 的固件库中,包含了一些函数和宏,用于配置和实现 USB MSD 设备。其中,包括了一些回调函数用于处理 USB 事件和控制传输。这些函数和宏可在 "usbh_msc_core.c" 和 "usbh_msc_scsi.c" 文件中找到。 在代码中,我们需要进行以下步骤来实现 USB MSD 设备的读: 1. 配置 USB 硬件: - 配置 USB 时钟 - 初始化 USB 控制器 - 配置 USB 引脚和通信接口 2. 初始化 USB 设备: - 调用 USBH_Init() 函数初始化 USB 栈 - 调用 USBH_RegisterClass() 函数注册 MSD 类 - 调用 USBH_Start() 函数启动 USB 栈 3. 等待 USB 设备连接: - 调用 USBH_Enum_Process() 函数处理 USB 事件和枚举过程,等待设备连接 4. 打开 USB MSD 设备: - 调用 MSC_Application() 函数,该函数会启动 MSD 设备并检查设备是否准备就绪 5. 读取数据: - 使用 USBH_MSC_Read() 函数从 MSD 设备中读取数据 - 指定读取的 LBA(逻辑块地址)和扇区数 6. 入数据: - 使用 USBH_MSC_Write() 函数将数据入 MSD 设备 - 指定入的 LBA 和扇区数 需要注意的是,以上代码只是一个基本的框架,具体的代码会根据实际需求和具体的 STM32 MCU 型号进行调整。该代码只负责 USB MSD 设备的读操作,还需要在其他地方添加额外的逻辑来处理读取和入的数据。 以上就是关于 STM32 USB MSD 设备读代码的简要说明,希望对你有所帮助。 ### 回答3: 完成STM32 USB Mass Storage Device的读功能需要编一些代码。以下是一个简单的代码示例,展示了如何使用STM32 HAL库来实现读USB Mass Storage设备。 首先,需要在CubeMX图形界面中使能USB设备和USB Mass Storage类。 然后,在主程序中包含必要的头文件和库文件,并定义一些全局变量和函数。 ```c #include "stm32f4xx_hal.h" #include "usb_host.h" #include "usbh_core.h" #include "usbh_msc.h" USBH_HandleTypeDef hUSB_Host; MSC_ApplicationTypeDef appli_state = APPLICATION_IDLE; uint8_t USBH_USR_Application(uint8_t *str); void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id); int main(void) { HAL_Init(); SystemClock_Config(); USBH_Init(&hUSB_Host, USBH_UserProcess, 0); USBH_RegisterClass(&hUSB_Host, USBH_MSC_CLASS); USBH_Start(&hUSB_Host); while (1) { USBH_Process(&hUSB_Host); USBH_USR_Application((uint8_t *)"USB Mass Storage"); // 自定义的应用程序功能 } } void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id) { switch (id) { case HOST_USER_SELECT_CONFIGURATION: break; case HOST_USER_DISCONNECTION: appli_state = APPLICATION_DISCONNECT; break; case HOST_USER_CLASS_ACTIVE: appli_state = APPLICATION_READY; break; case HOST_USER_CONNECTION: appli_state = APPLICATION_START; break; default: break; } } uint8_t USBH_USR_Application(uint8_t *str) { switch (appli_state) { case APPLICATION_IDLE: break; case APPLICATION_START: // 连接到Mass Storage设备时的操作,例如文件系统初始化 appli_state = APPLICATION_READY; break; case APPLICATION_READY: // 执行文件读操作,例如读取文件或将数据入文件 break; case APPLICATION_DISCONNECT: // 断开连接时的操作,例如关闭文件系统 appli_state = APPLICATION_IDLE; break; default: break; } return 0; } ``` 此代码片段仅提供了一个框架,还需要根据具体的应用程序需求进行进一步开发和添加功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值