我有一种算法,该算法具有一个函数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中加载文件并以此方式调用。 将函数封装在类中是否正确? 有没有解决该问题的模式?
答案 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)
在将文件作为参数传递到构造函数中或只是在构造函数中打开文件(看起来就像在第二个示例中)之间似乎似乎有细微差别,但是有一些重要的区别:
Algo
类之外Algo
类中进行测试在第一种情况下,Algo
类仅应与所需算法的执行有关。尽管打开文件似乎没有责任的区别,但是如果更改打开文件的逻辑该怎么办?例如,假设文件后来被压缩为.zip
个文件以节省空间:Algo
类应该不必更改。相反,Algo
对象的创建者将负责更改文件的打开方式。从Algo
类的角度来看,只要提供了文件句柄,它就不在乎文件是否存储为文本,二进制,压缩文本等。通过将文件作为参数传递给{{ 1}}构造函数,我们确保Algo
类与文件的特定表示分离。
在第二种情况下,我们能够单独测试Algo
类。代替使用真实数据,我们可以注入假文件并测试该算法是否可以使用这些假文件。如果我们已经包括了在构造函数的主体中打开文件的逻辑,则Algo
类将被迫使用生产(非测试)文件,并且将无法针对伪造/存根的数据进行测试。 / p>