基于ERP程序的公共代码中出现的问题及过度封装不方便维护的解决办法

下面是详细讲解“基于ERP程序的公共代码中出现的问题及过度封装不方便维护的解决办法”的完整攻略:

问题描述

在基于ERP程序开发中,通常会编写一些公共代码,用于实现各个模块之间的数据交互、统计分析等公共功能。然而,这些公共代码中常常存在以下问题:

  1. 代码重复冗余:由于各个模块有不同的需求,开发人员往往为了方便直接复制粘贴原有代码,导致公共代码中存在大量重复和冗余的代码片段。
  2. 封装过度:为了提高代码的可复用性和易维护性,开发人员常常会对公共代码进行过度的封装,导致代码结构复杂,不易理解和维护。

解决办法

针对以上问题,可以采用以下解决办法:

1. 代码复用

为了减少重复冗余的代码片段,可以将公共代码进行封装,形成一个独立的模块或类库,供各个模块共享调用。例如,对于重复的数据库连接和关闭操作,可以封装成一个公共函数,供各个模块调用。

同时,也可以采用面向对象编程的思想,将多个功能相似的代码封装成一个基类,继承该基类的子类可以共享基类的方法和属性。这样既能减少代码冗余,又能提高代码的复用性。

例如:

# 封装为公共函数
def connect_db():
    db = MySQLdb.connect(host='localhost', user='root', password='123456', db='erp')
    cursor = db.cursor()
    return db, cursor

# 继承基类
class Base(object):
    def connect_db(self):
        self.db, self.cursor = MySQLdb.connect(host='localhost', user='root', password='123456', db='erp')

    def close_db(self):
        self.cursor.close()
        self.db.close()

class ModuleA(Base):
    def do_something(self):
        self.connect_db()
        # do something
        self.close_db()

class ModuleB(Base):
    def do_something_else(self):
        self.connect_db()
        # do something else
        self.close_db()

2. 最小化封装

为了避免过度封装,可以采用最小化封装的原则,即尽量保持代码简洁和易读。同时,也要注意封装的层次不能过深,过多的层次会增加阅读和维护的难度。

例如,对于数据库操作代码:

class DbHelper(object):
    # 处理数据库连接和关闭
    def __init__(self, host, user, password, db):
        self.host = host
        self.user = user
        self.password = password
        self.db = db
        self.db_conn = None
        self.db_cursor = None

    def connect(self):
        self.db_conn = pymysql.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            db=self.db,
            charset='utf8mb4'
        )
        self.db_cursor = self.db_conn.cursor()

    def close(self):
        try:
            if self.db_cursor:
                self.db_cursor.close()
            if self.db_conn:
                self.db_conn.close()
        except Exception as e:
            print('close db connection error: ', e)

可以最小化封装,将数据库连接和关闭的代码直接放在模块内:

class ModuleA(object):
    # 处理数据库连接和关闭
    def __init__(self, host, user, password, db):
        self.host = host
        self.user = user
        self.password = password
        self.db = db
        self.db_conn = None
        self.db_cursor = None

    def connect(self):
        self.db_conn = pymysql.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            db=self.db,
            charset='utf8mb4'
        )
        self.db_cursor = self.db_conn.cursor()

    def close(self):
        try:
            if self.db_cursor:
                self.db_cursor.close()
            if self.db_conn:
                self.db_conn.close()
        except Exception as e:
            print('close db connection error: ', e)

    def do_something(self):
        self.connect()
        # do something
        self.close()

class ModuleB(object):
    # 处理数据库连接和关闭
    def __init__(self, host, user, password, db):
        self.host = host
        self.user = user
        self.password = password
        self.db = db
        self.db_conn = None
        self.db_cursor = None

    def connect(self):
        self.db_conn = pymysql.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            db=self.db,
            charset='utf8mb4'
        )
        self.db_cursor = self.db_conn.cursor()

    def close(self):
        try:
            if self.db_cursor:
                self.db_cursor.close()
            if self.db_conn:
                self.db_conn.close()
        except Exception as e:
            print('close db connection error: ', e)

    def do_something_else(self):
        self.connect()
        # do something else
        self.close()

这样代码会更加简洁,易于理解和维护。

示例说明

下面给出两个具体的示例,说明如何解决基于ERP程序的公共代码中出现的问题及过度封装不方便维护的解决办法。

示例一:数据库连接

假设在ERP系统中有多个模块需要访问同一个数据库,为了提高可复用性和扩展性,我们需要将数据库操作封装为公共代码。我们可以采用最小化封装的原则,将数据库连接和关闭操作封装在模块内部,减少过度封装的问题。

class ModuleA(object):
    # 处理数据库连接和关闭
    def __init__(self, host, user, password, db):
        self.host = host
        self.user = user
        self.password = password
        self.db = db
        self.db_conn = None
        self.db_cursor = None

    def connect(self):
        self.db_conn = pymysql.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            db=self.db,
            charset='utf8mb4'
        )
        self.db_cursor = self.db_conn.cursor()

    def close(self):
        try:
            if self.db_cursor:
                self.db_cursor.close()
            if self.db_conn:
                self.db_conn.close()
        except Exception as e:
            print('close db connection error: ', e)

    def do_something(self):
        self.connect()
        # do something
        self.close()

class ModuleB(object):
    # 处理数据库连接和关闭
    def __init__(self, host, user, password, db):
        self.host = host
        self.user = user
        self.password = password
        self.db = db
        self.db_conn = None
        self.db_cursor = None

    def connect(self):
        self.db_conn = pymysql.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            db=self.db,
            charset='utf8mb4'
        )
        self.db_cursor = self.db_conn.cursor()

    def close(self):
        try:
            if self.db_cursor:
                self.db_cursor.close()
            if self.db_conn:
                self.db_conn.close()
        except Exception as e:
            print('close db connection error: ', e)

    def do_something_else(self):
        self.connect()
        # do something else
        self.close()

示例二:日志输出

假设在ERP系统中有多个模块需要输出日志信息,我们需要将日志输出封装为公共代码。我们可以采用代码复用的方式,将日志输出封装为一个独立的模块LogHelper,供各个模块调用。

# 封装日志输出
class LogHelper(object):
    def __init__(self, logger_name, log_file_path):
        self.logger = logging.getLogger(logger_name)
        self.logger.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        file_handler = logging.FileHandler(log_file_path)
        file_handler.setLevel(logging.DEBUG)
        file_handler.setFormatter(formatter)
        self.logger.addHandler(file_handler)

    def info(self, log_message):
        self.logger.info(log_message)

    def warning(self, log_message):
        self.logger.warning(log_message)

    def error(self, log_message):
        self.logger.error(log_message)

class ModuleA(object):
    def __init__(self, logger):
        self.logger = logger

    def do_something(self):
        self.logger.info('invoke ModuleA.do_something')

class ModuleB(object):
    def __init__(self, logger):
        self.logger = logger

    def do_something_else(self):
        self.logger.warning('invoke ModuleB.do_something_else')

这样,我们可以通过实例化一个LogHelper对象,为各个模块提供日志输出的功能,同时避免了代码重复和过度封装的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于ERP程序的公共代码中出现的问题及过度封装不方便维护的解决办法 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Powershell使用嵌套哈希表实例 嵌套哈希表的2种写法例子

    PowerShell使用嵌套哈希表实例 在PowerShell中,嵌套哈希表是一种非常有用的数据结构,它允许我们在一个哈希表中存储另一个哈希表。这种嵌套结构可以帮助我们更好地组织和管理复杂的数据。 示例1:嵌套哈希表的基本写法 下面是一个简单的示例,展示了如何使用嵌套哈希表来存储员工的信息: # 创建一个空的嵌套哈希表 $employees = @{} # …

    other 2023年7月28日
    00
  • win7提示1分钟后重启怎么回事?win7系统1分钟自动重启解决方法

    Win7提示1分钟后重启怎么回事? 当你在电脑使用Win7系统时,某些情况下,你可能会看到一个弹窗提示框,上面写着“系统将在1分钟后自动关机重启”,这时候你肯定会觉得十分苦恼以及不知道该如何解决。下面,我们将讲解怎么回事以及如何解决这个问题。 什么是Win7提示1分钟后重启的问题? Win7提示1分钟后重启是一个非常常见的Windows系统故障。当你的电脑系…

    other 2023年6月27日
    00
  • 开源纯C#工控网关+组态软件

    本文将介绍如何使用C#开发一个工控网关和组态软件,并将其开源。本文将分为两部分,第一部分介绍如何开发工控网关,第二部分介绍如何开发组态软件。 1. 开发工控网关 1.1 硬件选型 工控网关需要具备以下功能: 支持多种通信协议,如Modbus、OPC UA等; 支持多种物联网协议,如MQTT、CoAP等; 支持多种接口,如RS232、RS485、Etherne…

    other 2023年5月5日
    00
  • GoLang基于zap日志库的封装过程详解

    GoLang是一个非常流行的开发语言,其最大的优点之一是其强大的日志处理能力,提供了许多第三方的日志库供开发者使用。其中,Zap是GoLang生态系统中最强大、最快速、最稳定的日志库之一,被广泛应用于各种规模的开源项目和商业项目中。在实际的项目中,我们常使用Zap来记录调试、警告、错误等信息,以便于我们及时的进行发现和处理。 在本攻略中,我们将探讨如何基于Z…

    other 2023年6月25日
    00
  • 更改IP 勿须重启

    更改IP 勿须重启攻略 更改IP地址是在计算机网络中常见的任务之一。在某些情况下,我们可能需要更改计算机的IP地址,而不希望重启计算机。下面是一个详细的攻略,介绍了如何更改IP地址而无需重启计算机。 步骤一:打开网络设置 首先,我们需要打开计算机的网络设置。在Windows操作系统中,可以通过以下步骤打开网络设置: 点击任务栏右下角的网络图标。 在弹出的菜单…

    other 2023年7月31日
    00
  • JavaScript中的常见继承总结

    以下是关于“JavaScript中的常见继承总结”的完整攻略: 什么是继承 继承是面向对象编程中的一种重要概念,它使得子类(或派生类)能够“继承”父类(或基类)的属性和方法。子类可以在继承的基础上增加新的方法,或者重写自己的方法。继承的目的是实现代码的复用,减少冗余代码。 JavaScript中的继承 在JavaScript中,继承可以通过原型链和构造函数实…

    other 2023年6月26日
    00
  • pythonfalse

    PythonFalse:Python中常见的False值 Python是一门高级编程语言,也是最易学的语言之一,由于其简单易懂的语言特性、强大的支持库以及广泛的应用领域,Python越来越受到程序员的欢迎。 在Python中,有一些常见的False值。这些False值通常是由逻辑操作生成的,这些操作非常重要,因为它们可以帮助程序员写出更加健壮的程序。在本文中…

    其他 2023年3月28日
    00
  • delphi 组件安装教程详解

    Delphi是一种面向对象的编程语言,常用于Windows平台的应用程序开发。在Delphi中,组件是一种可重用的代码模块,可以大大提高开发效率。在本文中,我们将详细介绍Delphi组件的安装教程,并提供两个示例说明。 Delphi组件安装教程 步骤1:下载组件 首先,我们需要从组件提供商的网站上下载所需的组件。通常,组件提供商会提供一个安装程序或一个ZIP…

    other 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部