首页 > 其他分享 >写代码切忌过度设计

写代码切忌过度设计

时间:2024-08-30 11:53:28浏览次数:14  
标签:product price self order 过度 切忌 class 代码 def

过度工程(overengineering)是软件开发中一个常见的问题,特别是在尝试应用设计模式和抽象概念时。它通常会导致代码不必要的复杂,增加了维护成本和理解难度。以下是一个示例,展示了在一个简单问题上应用过度工程的情况,以及如何简化它以避免这种问题。

过度工程的示例

假设我们需要一个功能,根据用户的语言偏好来显示一条问候消息。以下是一个过度设计的解决方案:

from abc import ABC, abstractmethod

class Language(ABC):
    @abstractmethod
    def get_greeting(self):
        pass

class English(Language):
    def get_greeting(self):
        return "Hello!"

class Spanish(Language):
    def get_greeting(self):
        return "¡Hola!"

class GreetingService:
    def __init__(self, language):
        self.language = language

    def greet(self):
        print(self.language.get_greeting())

# 使用
english = English()
greeting_service = GreetingService(english)
greeting_service.greet()

这个示例使用了抽象基类和继承,每种语言都有自己的类实现。虽然这种方式在设计更复杂的系统时可能是合适的,但对于这个简单的需求来说显然是过度了。

简化后的示例

对于简单的需求,我们可以用更直接的方式来实现,避免不必要的抽象和复杂性。

def greet(language):
    greetings = {
        "English": "Hello!",
        "Spanish": "¡Hola!"
    }
    print(greetings.get(language, "Hello!"))

# 使用
greet("English")
greet("Spanish")

在这个简化的版本中,我们使用了一个字典来直接映射语言和相应的问候语,这样避免了复杂的类结构和接口设计。这种方法对于这个问题来说足够简洁且易于维护。

我们来看一个稍微复杂一点的例子,涉及到一个简单的电子商务系统,其中包含产品和订单处理功能。我们将比较一个过度工程的解决方案和一个更加简化的方法。

过度工程的示例

在这个示例中,我们将创建多个类和接口,以处理产品的存储和订单的处理。我们将使用抽象类和多个接口来展示一个复杂的系统设计。

from abc import ABC, abstractmethod

# 抽象产品类
class Product(ABC):
    @abstractmethod
    def get_price(self):
        pass

# 具体产品类
class Book(Product):
    def __init__(self, price):
        self.price = price

    def get_price(self):
        return self.price

# 订单接口
class Order(ABC):
    @abstractmethod
    def process_order(self):
        pass

# 具体订单类
class BookOrder(Order):
    def __init__(self, product):
        self.product = product

    def process_order(self):
        print(f"Processing order for a book priced at {self.product.get_price()}")

# 工厂模式用于创建订单
class OrderFactory:
    @staticmethod
    def create_order(product_type, price):
        if product_type == "book":
            return BookOrder(Book(price))
        raise ValueError("Unknown product type")

# 使用
order = OrderFactory.create_order("book", 10)
order.process_order()

在这个例子中,我们设计了一个复杂的系统,其中包含产品和订单的抽象类、具体实现、以及一个用于创建订单的工厂类。虽然这为将来的扩展提供了很大的灵活性,但对于目前的需求来说可能是过度的。

简化后的示例

下面是一个更简单的解决方案,它使用更少的类和更直接的方法来处理相同的功能。

 

# 简单的产品和订单处理
def process_order(product_type, price):
    if product_type == "book":
        print(f"Processing order for a book priced at {price}")
    else:
        raise ValueError("Unknown product type")

# 使用
process_order("book", 10)

在这个简化的版本中,我们没有使用抽象类、接口或工厂模式。相反,我们定义了一个函数来直接处理订单。这种方法对于当前的需求是足够的,并且更容易理解和维护。

结论

选择设计的复杂度应当基于当前和预见的未来需求。在许多情况下,简单的设计可以更有效地满足需求,减少开发和维护的成本。过度工程可能导致代码难以理解和维护,特别是在团队成员或需求频繁变动的情况下。适当的简化可以提高开发效率和系统的可维护性。

标签:product,price,self,order,过度,切忌,class,代码,def
From: https://blog.csdn.net/hebtu666/article/details/141677596

相关文章

  • 提升代码可读性的十八条建议5
    13.避免过多的参数函数或方法的参数应该尽可能少,过多的参数会使得函数难以理解和使用。不整洁(错误):defcreate_user(name,age,gender,email,phone,address,country,state,city,zip_code):pass整洁(正确):classUser:def__init__(self,name,age,gen......
  • 在数小时内构建 CRM:你需要了解的顶级无代码/低代码工具
    或许你在阅读这篇文章时,心里会有一个疑问:在类似Salesforce这样强大的传统CRM系统已经如此成熟的今天,为什么企业还需要选择用低代码或无代码平台来构建CRM呢?传统CRM系统确实功能强大,但它们也有一些不可忽视的痛点。对于很多企业,尤其是中小型企业,高昂成本和复杂性让他们望而......
  • 代码随想录day45 || 115 不同子序列, 583 两个字符串删除操作, 72 编辑距离
    115不同子序列funcnumDistinct(sstring,tstring)int{ //动态规划,思考一下判断连续和不连续的区别,如果相等都是左上角+1,如果不等,连续情况就是直接等于左上角,不连续情况直接归零 //dp[i][j]表示s[i]中存在t[j]结尾的的个数 //递推公式,不要求连续字串,所以,如果s[i......
  • 基于奇异值分解的MVDR算法功率谱估计附Matlab代码
    MVDR(MinimumVarianceDistortionlessResponse)算法是一种常用于信号处理领域的功率谱估计方法,该算法利用奇异值分解(SingularValueDecomposition,SVD)来实现对信号的空间滤波,从而提高功率谱估计的准确性和可靠性,本文将介绍MVDR算法的原理并提供使用Matlab编写的源代码示例。MV......
  • vb6.0版本钢琴简谱播放程序代码QZQ-2024-8-30
    OptionExplicitConstINVALID_NOTE=-1’Codeforkeyboardkeysthatwedon’thandleDimnumDevicesAsLong’numberofmidioutputdevicesDimcurDeviceAsLong’currentmidideviceDimhmidiAsLong’midioutputhandleDimrcAsLong’return......
  • VB版本电子琴简谱播放器代码QZQ-2024-8-30
    OptionExplicitPrivateDeclareSubSleepLib“kernel32”(ByValdwMillisecondsAsLong)PrivateConstsColr=&H4000&DimmmAsVariant'不再使用NewsMidi,而是使用Variant类型,可以存储不同类型的数据PrivateDeclareFunctionmidiOutCloseLib“winmm.dl......
  • VB版本MIDI钢琴简谱播放器全代码QZQ-2024-8-30
    PrivateDeclareFunctionGetKeyState%Lib“user32”(ByValnVirtKeyAsLong)PrivateDeclareSubSleepLib“kernel32”(ByValdwMillisecondsAsLong)PrivatesuduAsIntegerPrivateConstVK_LBUTTON&=&H1PrivateisOgainAsBoolean'是否重复按键Pri......
  • vscode-snippets,教你一个#include打出所有所需代码
    前言之前在打cf之类的比赛的时候总能看到别人的代码最开始总是一大串的火车头,相信也有人和我一样很喜欢这样的火车头,喜欢这样的风格化代码(别人能不能看懂是另外一回事)。但是每次复制粘贴这些火车头就很麻烦,有没有什么办法能一键打出火车头呢,这里提供一种思路,帮你一个#include打出......
  • PageOffice6国产Linux系统最简集成代码(Asp.Net)
    本文描述了PageOffice产品在普通的Asp.Net项目中如何集成调用。PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、longarch芯片架构。新建Asp.Net项目:PageOffice6-Net-Simple在您的web项目的“依赖项-包-管理NuGet......
  • 代码随想录算法day3 - 链表1
    题目1203.移除链表元素给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],v......