【问题标题】:Proper way of working with .txt-files in object-orientated programming在面向对象编程中使用 .txt 文件的正确方法
【发布时间】:2015-01-07 08:39:14
【问题描述】:

我正在开发的程序使用多个不同的 .txt 文件来存储其数据。假设我们的文件如下所示:

a1; b1; c1; 
a2; b2; c2; 
...

为了处理这样的文件,我创建了一个类,假设它被称为 CFile。现在我编写了函数来获取每个向量 a、b 和 c。他们的工作方式如下:

Public Shared Function getAFromFile() As List(Of Double)
        Dim datei As New FileStream(filePathSelectedInForm, FileMode.Open)
        Dim leser As New StreamReader(datei)
        Dim zeile As String
        Dim werte() As String

        Dim a As New List(Of Double)
        Dim b As New List(Of Double)
        Dim c As New List(Of Double)
        While leser.Peek <> -1
            zeile = leser.ReadLine
            werte = zeile.Split(";")
            a.Add(werte(0))
            b.Add(werte(1))
            c.Add(werte(2))
        End While

        leser.Close()
        datei.Close()

        getAFromFile = a
    End Function

当然我现在想用数据计算一些东西。假设我想将每个 Double 与另一个名为 x 的文件的 Double 相乘,然后添加另一个名为 r 的值。所以我在我的类中生成了另一个函数,如下所示:

   Public Shared Function calculateWithA(r as Double) As List(Of Double)
        dim a as List(Of Double) = getAFromFile()
        dim x as List(Of Double) = getXFromFile()
        Dim result As New List(Of Double)
        For i = 0 To a.Count - 1
            result.Add(a.Item(i) * x.Item(i) + r)
        Next
        calculateWithA = result  
   End Function

假设我们在一个表单上有一个datagridview,它填充了我们的向量a、b和c。所以我们有 3 列和未定义的行数,具体取决于文本文件中 a、b 和 c 元素的数量。 现在我添加了第四行,我想在其中存储计算值。正确的方法是打开我的文件,获取向量a,打开另一个文件,获取向量x,将它们相乘,加上r,然后将其写入datagridview。

现在想象 r 是 datagridview-row 的索引。我现在需要一个从 r=0 到 'amount of rows-1' 的循环并调用 calculateWithA(r)。每次调用该函数时,都会在其中调用两个函数 getAFromFile() 和 getXFromFile()。我认为打开文件非常慢,这就是为什么我认为最好将 a 和 x 公开共享 List(Of Double) 并只获取它们一次,然后在函数 calculateWithA 中使用它们。像这样的:

 Private Shared a As New List(Of Double)
 Private Shared x As New List(Of Double)

 Public Shared sub getAandX()
            a  = getAFromFile()
            x  = getXFromFile()
            Dim result As New List(Of Double)
            For i = 0 To a.Count - 1
                result.Add(a.Item(i) * x.Item(i) + r)
            Next
 End Sub

 Public Shared Function calculateWithA(r as Double) As List(Of Double)
            Dim result As New List(Of Double)
            For i = 0 To a.Count - 1
                result.Add(a.Item(i) * x.Item(i) + r)
            Next
            calculateWithA = result  
       End Function

在这种情况下,我可以多次调用calculateWithA(r),而处理文件的性能密集型函数只调用一次。但我必须在使用 calculateWithA(r) 之前调用 getAandX(),否则我会收到错误或使用 a 和 x 的旧值。这就是我的问题所在: 我希望我的程序尽可能模块化,并遵循面向对象程序的规则。但是,如果我必须调用一个函数来确保另一个函数有效,那就违反了这些规则,对吧?但是,如果我使用我的模块化版本,每次调用该函数时都调用每个文件,我会得到一个非常糟糕的性能和很长的等待时间。 你们说什么?我应该走哪条路或者有更好的方法来解决这个问题?

提前致谢!

【问题讨论】:

    标签: vb.net file shared object-oriented-analysis


    【解决方案1】:

    在这种情况下,我想您应该从 calculateWithA 调用 getAandX,以便您首先检查列表是否为空。如果它们是空的,请调用 getAandX,然后运行循环以获取结果。循环后清除列表 a 和 x 因为它们不再有用了。 现在每次调用 calculateWithA 时,它都会首先更新数据,然后处理它。 这样,文件IO操作将发生一次,加载数据的责任将由calculateWithA函数负责。

    【讨论】:

    • 但在这种情况下,我必须在循环后清除列表。如果我忘记了,下次就不行了。所以我必须再次调用函数来确保另一个函数正常工作。我必须在循环之后立即调用函数,而不是在循环之前调用函数。我认为帽子不是面向对象的。
    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2013-04-09
    • 2011-09-23
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多