基于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日

相关文章

  • jquery 页面滚动到底部自动加载插件集合

    jQuery是一种流行的JavaScript库,它简化了页面编程的复杂性。下面将提供一个完整的攻略指南,描述如何使用jQuery实现Web页面滚动到底部自动加载插件集合。 1. 概述 在Web页面中,当用户滚动到底部时,可以使用jQuery自动加载新内容,从而为用户提供更好的体验。通常,在向远程服务器提出请求之前,需要判断当前页面是否已滚动到页面底部。此时,…

    other 2023年6月25日
    00
  • 详解python metaclass(元类)

    详解Python Metaclass(元类) Metaclass指的是用来创建类的“类”。Python中每一个类都是由其相应的元类所创建的。元类规定了实例化一个新类时需要做什么,类是如何构造的,方法如何组织的等信息。本篇文章将详细讲解Python中的Metaclass及其使用方法。 什么是Metaclass 在Python中,一切皆对象。类也是对象。Pyth…

    other 2023年6月27日
    00
  • linux如何配置bond

    Linux如何配置Bond Bonding技术是一种基于Linux内核,将多个物理网卡进行绑定,实现负载均衡和容错的网络技术。它在企业级网络中得到了广泛的应用,本文将介绍如何在Linux系统中进行Bonding配置。 步骤一:安装依赖工具 在进行Bonding配置之前,需要安装ifenslave工具,ifenslave是集成在Linux内核中的网络加速模块(…

    其他 2023年3月28日
    00
  • Java关键字instanceof用法及实现策略

    Java关键字instanceof用法及实现策略 什么是instanceof关键字? instanceof 关键字是 Java 语言中一个很重要的关键字,用于判断一个对象是否为一个类或其子类的实例。 instance关键字的语法 instanceof 关键字的语法如下: object instanceof class 其中,object 可以是一个对象名或者…

    other 2023年6月26日
    00
  • 用Java将字符串的首字母转换大小写

    Sure! 下面是使用Java将字符串的首字母转换为大写的完整攻略: 首先,我们需要使用Java的内置函数来实现首字母转换。可以使用substring()函数来获取字符串的首字母,然后使用toUpperCase()函数将其转换为大写。 下面是一个示例代码,演示如何将字符串的首字母转换为大写: public class Main { public static…

    other 2023年8月16日
    00
  • springboot 中整合mybatis多数据源不使用JPA

    Spring Boot中整合MyBatis多数据源不使用JPA的完整攻略 1. 添加依赖 首先,在pom.xml文件中添加MyBatis和数据库驱动的依赖。例如,如果你使用MySQL数据库,可以添加以下依赖: <dependencies> <!– MyBatis –> <dependency> <groupId&…

    other 2023年10月12日
    00
  • 怎么查看路由器有多少ip地址? 具体有哪些设备连接上了?

    要查看路由器上的IP地址和连接的设备,您可以按照以下步骤进行操作: 首先,确保您已经连接到路由器的管理界面。通常,您可以在浏览器中输入路由器的默认网关IP地址来访问管理界面。例如,大多数路由器的默认网关IP地址是192.168.1.1或192.168.0.1。您可以在计算机的网络设置中找到默认网关IP地址。 打开您选择的浏览器,并在地址栏中输入路由器的默认网…

    other 2023年7月30日
    00
  • Jmeter设置全局变量token过程图解

    JMeter设置全局变量token过程图解攻略 JMeter是一款功能强大的性能测试工具,可以模拟多种负载情况对目标系统进行测试。在测试过程中,有时需要使用全局变量来保存一些动态生成的值,比如token。下面是设置全局变量token的详细攻略,包含两个示例说明。 步骤一:添加用户定义的变量 打开JMeter,创建一个测试计划。 在测试计划上右键单击,选择\”…

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