如何写出“简单”代码?

大家发现没,设计原则通常都有一个很普遍的特点:语言很简练,听上去很有道理,但是拿来指导实践根本无从下手。比如说,在学习简单原则(也就是我们平时说的 KISS 原则) 时,你可能遇到过下列问题:

  • 为什么身边的程序员都告诉你保持“简单”代码很重要?

  • 什么才是好的“简单”代码?

  • 如何能写出“简单”的代码?

  • YAGNI 原则和 KISS 原则是相同的吗?

这些问题看上去简单,回答起来却不简单。所以,今天我们就带着这些问题,重新开始学习 KISS 原则。

一、为什么要让代码保持“简单”?

KISS 原则(Keep It Simple and Stupid),翻译过来就是:保持简单,保持愚蠢

KISS 原则自 1970 年起就开始得到广泛使用。现在在软件开发中,KISS 原则通常是指代码应该更容易理解、更容易编写、更容易改变,并应该一直保持如此。

可能你会疑问:为什么非得要让代码保持“简单”呢?写出来能运行不就好了吗?其实主要有以下三个重要的原因。

第一,防止代码腐坏。编程里有一个很大的矛盾:刚开始时一切都好,代码简单可读,逻辑清晰,可随着时间的推移,特别是当越来越多的人参与到项目中时,代码数量呈指数级增长,功能越来越丰富,逻辑却越来越复杂,代码变得难以理解和难以维护,这时代码就开始变得腐坏。保持代码简单性一方面可以降低模块的理解难度,另一方面也让代码修改的范围边界更清晰,这样就能有效地防止代码腐坏。

第二,减少时间成本的投入。我们知道软件复杂度有三个来源:代码规模、技术复杂度和实现复杂度。通常来说,代码越复杂,在这三方面投入的时间成本就会越多。比如,维护 10 万行代码和维护 1000 行代码所需要投入的理解与逻辑梳理时间是不同的。再比如,使用 Redis 作为缓存和使用 LRU 本地缓存所需要的学习时间也是不同的。

对于开发人员来说,维护代码必然需要花时间修改、调试、理解内在逻辑并让代码正常运行,一旦代码非常复杂,势必会增加时间成本,进而让开发团队的研发成本增加。如果代码能够保持简单清晰,那么最直接的效果就是降低学习与维护代码的时间,这是很多开发团队都愿意看到的结果。

第三,

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当然可以,请参考以下代码: ``` import asyncio from PySide2.QtCore import QObject, Signal, Slot from PySide2.QtWidgets import QApplication, QWidget, QComboBox, QPushButton, QVBoxLayout import visa class Instrument: def __init__(self, resource_name): self.resource_name = resource_name self.rm = visa.ResourceManager() self.inst = None async def connect(self): self.inst = await asyncio.to_thread(self.rm.open_resource, self.resource_name) async def disconnect(self): await asyncio.to_thread(self.inst.close) self.inst = None async def query_idn(self): return await asyncio.to_thread(self.inst.query, "*IDN?") class MainProgram(QObject): instruments_updated = Signal(list) def __init__(self): super().__init__() self.instruments = [] async def refresh_instruments(self): resources = await asyncio.to_thread(visa.ResourceManager().list_resources) new_instruments = [Instrument(resource) for resource in resources] for instrument in self.instruments: if instrument not in new_instruments: await instrument.disconnect() for instrument in new_instruments: if instrument not in self.instruments: await instrument.connect() self.instruments = new_instruments idns = await asyncio.gather(*[instrument.query_idn() for instrument in self.instruments]) self.instruments_updated.emit(idns) class UI(QWidget): def __init__(self): super().__init__() self.combo_box = QComboBox() self.refresh_button = QPushButton("Refresh") layout = QVBoxLayout() layout.addWidget(self.combo_box) layout.addWidget(self.refresh_button) self.setLayout(layout) class Controller: def __init__(self): self.app = QApplication([]) self.ui = UI() self.main_program = MainProgram() self.ui.refresh_button.clicked.connect(self.main_program.refresh_instruments) self.main_program.instruments_updated.connect(self.update_instruments) @Slot(list) def update_instruments(self, idns): self.ui.combo_box.clear() self.ui.combo_box.addItems(idns) def run(self): self.ui.show() asyncio.ensure_future(self.main_program.refresh_instruments()) self.app.exec_() if __name__ == "__main__": controller = Controller() controller.run() ``` 这段代码实现了一个简单的UI界面,包含一个ComboBox和一个刷新按钮,点击刷新按钮后,ComboBox会列出所有连接的GPIB仪器的IDN。代码中使用了异步编程方法,使用了PyVISA库来连接GPIB仪器。在MainProgram类中,refresh_instruments方法用于查询所有已连接的仪器的IDN,并将其发送到instruments_updated信号中。在UI类中,update_instruments槽函数用于更新ComboBox的内容。在Controller类中,将UI界面和MainProgram类连接起来,实现了整个程序的控制逻辑。 希望这个代码能够帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱娃哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值