程序设计-如何改进它以及如何避免耦合(Python)?

程序设计-如何改进它以及如何避免耦合(Python)?,python,design-patterns,module,Python,Design Patterns,Module,在下面的Python程序结构中,有两个带函数的模块 问题描述: 函数在各地的其他函数中使用。强耦合依赖。 例如,模块2中读取文件的func1会被多次调用,因为这两个模块中的几乎所有其他函数都会调用它。 这是一种资源和性能密集型的做法,但单是一种不好的做法。 每次调用funct1时,从文件中读取如此多次可能代价高昂。 问题: 改进这种设计的好方法是什么 例如,将助手模块2中的函数作为参数传递给模块1中的函数? [如果我这样做,模块2中的函数仍然相互依赖,即funct4使用funcr1、funct2

在下面的Python程序结构中,有两个带函数的模块

问题描述:

函数在各地的其他函数中使用。强耦合依赖。 例如,模块2中读取文件的func1会被多次调用,因为这两个模块中的几乎所有其他函数都会调用它。 这是一种资源和性能密集型的做法,但单是一种不好的做法。 每次调用funct1时,从文件中读取如此多次可能代价高昂。 问题: 改进这种设计的好方法是什么

例如,将助手模块2中的函数作为参数传递给模块1中的函数? [如果我这样做,模块2中的函数仍然相互依赖,即funct4使用funcr1、funct2、funct3等]

我的范例开始于: 我在想:啊,我将有一个主要模块,在那里主要的事情发生。然后我将有一个用于函数的侧模块,这些函数做一些准备工作和清理,并从模块1调用它们。 好吧,现在我弄得一团糟。 我想知道一个好的设计是否能减少功能之间的相互依赖?每个函数只做一件事,不调用其他函数?? 我应该上课吗?怎样是关于什么时候使用类还是模块?功能设计与面向对象设计

您将如何重新设计它,以便尽可能少的耦合,并且文件只读取一次或尽可能少的次数

谢谢你的提示

单元1 主模块,程序在这里执行

从模块2导入*

f1 -使用funct1 4次 -使用funct2 2次

f2 -使用func1 2次 -使用func2 2次

f3 -使用func1 1次

f4 -使用func2 3次 -使用func3 3次 -使用func4 1次

f5 -使用func1 2次 -使用func2 2次 -使用func4 4次

f6 -使用func1 3次 -使用func2 3次 -使用func4 2次

单元2 具有向模块1提供清理和其他功能的帮助器功能

职能1 从打开“x.txt”、“r”af f:…的文件中读取

功能2 -使用func1 1次

职能3 -使用func1 1次

职能4 -使用func1 1次 -使用func2 2次 -使用func3 1次


假设文件没有被写入,我已经创建了一个非常通用的概要,介绍了一种减少文件打开和关闭次数的方法。以及调用其他函数的次数。在初始化帮助程序时,它们只能运行一次。尽管如此,由于辅助对象的性质,这并不能真正减少耦合量

模块2:

class Helpers(object):
    def __init__(self, fp=None):
        self.contents = self.func1(self.fp)
        self.func2_results = self.func2()
        self.func3_results = self.func3()
        self.func4_results = self.func4()
        self.results = {'name2':self.func2_results,
                        'name3':self.func3_results,
                        'name4':self.func4_results
                       }

    def func1(self):
        # read file
        with open(...) as f:
            contents = f.read()
        return contents

    def func2(self):
        # doStuff(self.contents)
        return something

    def func3(self):
        # doStuff(self.contents)
        return something

    def func4(self):
        # func2 and func3 were already run once in init
        # so lets use the results from them
        # self.func2_results
        # self.func2_results
        # self.func3_results
        return something       
模块1:

from module2 import Helpers

class Main(object):
    def __init__(self, fp=None):
        self.helper = Helpers(self.fp)
        self.contents = self.helper.contents
        self.name2 = self.helper.results['name2']
        self.name3 = self.helper.results['name3']
        self.name4 = self.helper.results['name4']
    def f1(self):
        # doStuff(self.contents)
        # doStuff(self.name2)
        return thing1
    def f2(self):
        # doStuff(self.contents)
        # doStuff(self.name2)
        return thing2
    def f3(self):
        # doStuff(self.helper.contents)
        return thing3
    def f4(self):
        # doStuff(self.name2)
        # doStuff(self.name3)
        # doStuff(self.name4)
        return thing4
    def f5(self):
        # doStuff(self.contents)
        # doStuff(self.name2)
        # doStuff(self.name4)
        return thing5
    def f6(self):
        # doStuff(self.contents)
        # doStuff(self.name2)
        # doStuff(self.name4)
        return thing6
然后它可以像这样运行:

from module1 import Main

here = Main(fp="/some/file.xml")
here2 = Main(fp="/some/file2.xml")
print(here.name2)
print(here.name3)
print(here.name4)
# each method will have only run once 
f1 = here.f1()
f2 = here.f2()
f3 = here.f3()
f4 = here.f4()
f5 = here.f5()
f6 = here.f6()
# these will run the helpers again from within `Helpers()`
# say for example if the file contents have been updated
h1 = here.helper.func1()
h2 = here.helper.func2()
h3 = here.helper.func3()
h4 = here.helper.func4()

这些问题中有一些非常主观,如果没有更多的信息,很难回答。如果你只是问一下这些想法,一般来说,也许是一个更好的问的地方。如果您有一个特定的问题,那么文件有多大?所有这些函数都需要文件的全部内容吗?文件是否有某种结构,即csv或json?你只是在读文件吗?这个程序做什么?它是用Python编写的XML解析器。程序读取并处理一个XML文件。模块1主要检查语法有效性。模块2提供了一些辅助功能,例如将所有标记作为列表获取、计算尖括号、获取标记名、tgs之间的数据内容等。应用程序有2个模块长,正如您在模块1中关于10个函数和模块2中关于6个函数的问题中所看到的。读取的XML文件可以是任意大小。大多数函数确实需要访问XML文件。我遇到的问题是,在所有这些函数中,我只调用get_xml_file方法,这意味着文件被多次读取。在我看来,这本身就是一个问题,我不知道如何更改它。此外,我在另一个执行其他操作的函数中使用了调用get_xml_file的函数,因此该文件被读取两次get_xml_file被调用两次,而无需这样做。一定有更好的设计…?如果您还没有将xml读取器变成一个类,那么您可能会希望它成为一个类。然后,您可以将文件对象传递给构造函数,看看pythons的CSV模块。如果文件内容适合内存,则可以将文件读入类成员变量。更好的方法可能是保留file对象,并且在任何时候只读取所需的内容,使用seek方法移回文件的开头。这还可以让您从其他类方法访问文件,只需self.file,而无需调用函数。