封装在类中的函数可一次加载所需文件

时间:2018-08-01 09:50:41

标签: oop design-patterns

我有一种算法,该算法具有一个函数calculate(x,y),该函数调用许多较小的函数,这些函数需要使用两个我只想加载一次的大文件。

一次加载一次的方法是加载它们,并将它们传递给calculate(x,y,f1,f2),它们将传递给在内部调用的next和next函数。

def calculate(x, y, f1, f2):
    a = function1(x, y, f1) 
    b = function2(x, y, f2)

def function1(x, y, f1):
    #process further with f1 that is passed by arg further and further...

其他方法是上课

class Algo
    def __init__():
         self.f1 = load_f1...
         self.f2 = load_f2...

    def calculate(self, x, y):
        a = function1(x, y) 
        b = function2(x, y)

    def function1(self, x, y):
        #process further with self.f1...

并在init中加载文件并以此方式调用。 将函数封装在类中是否正确? 有没有解决该问题的模式?

2 个答案:

答案 0 :(得分:0)

我认为,关于SRP原理,绝对有可能只使用一个类来加载两个大文件。 我认为使用自己的类而不是调用不同的方法似乎更具逻辑性,因为作为界面的用户(或者将使用您的代码),我不想调用几种不同的方法,我只想这样做

FileLoader fileLoader = new FileLoeader();
List<File> loadedFiles = fileLoeader.init(filePaths);

public class FileLoader() {
private List<File> readFiles;
public void init(List<String> filePaths) { filePaths.foreach(s -> loadFile(s) }

public int calculate(Algorithm alg) { ... }

}

如果仅需要用于上述计算的文件,则可以简单地执行init,然后在此类中调用计算方法并注入所需的算法。 如果要获取文件以进一步使用,可以将它们存储在可访问的列表中,如我在代码示例中所示。我的示例是java,但可以转换为任何其他语言。

答案 1 :(得分:0)

解决此问题的常用技术是将大文件封装在一个对象中,然后将这些对象传递给算法类的构造函数。例如:

class Algo
    def __init__(self, file1, file2):
         self.f1 = file1
         self.f2 = file2

    def calculate(self, x, y):
        a = function1(x, y) 
        b = function2(x, y)

    def function1(self, x, y):
        #process further with self.f1...

打开文件是创建Algo对象的对象的责任。例如:

large_file_1 = open("some_file.txt")
large_file_2 = open("some_other_file.txt")
algo = Algo(large_file_1, large_file_2)

在将文件作为参数传递到构造函数中或只是在构造函数中打开文件(看起来就像在第二个示例中)之间似乎似乎有细微差别,但是有一些重要的区别:

  1. 打开文件的职责已移至Algo类之外
  2. 伪造的文件可以注入Algo类中进行测试

在第一种情况下,Algo类仅应与所需算法的执行有关。尽管打开文件似乎没有责任的区别,但是如果更改打开文件的逻辑该怎么办?例如,假设文件后来被压缩为.zip个文件以节省空间:Algo应该不必更改。相反,Algo对象的创建者将负责更改文件的打开方式。从Algo类的角度来看,只要提供了文件句柄,它就不在乎文件是否存储为文本,二进制,压缩文本等。通过将文件作为参数传递给{{ 1}}构造函数,我们确保Algo类与文件的特定表示分离。

在第二种情况下,我们能够单独测试Algo类。代替使用真实数据,我们可以注入假文件并测试该算法是否可以使用这些假文件。如果我们已经包括了在构造函数的主体中打开文件的逻辑,则Algo类将被迫使用生产(非测试)文件,并且将无法针对伪造/存根的数据进行测试。 / p>