jjzjj

c# - 构造函数应该解析输入吗?

coder 2024-05-26 原文

通常,我发现我必须实例化一堆对象,但我发现将此实例化的参数作为人类可读的文本文件提供更容易,我手动编写并将其作为输入输入到程序中。

例如,如果对象是 Car,那么文件可能是一堆行,每行包含名称、速度和颜色(三个必需的构造函数参数),用制表符分隔:

My car          65       Red
Arthur's car    132      Pink
Old junk car    23       Rust brown

这对我来说很容易进行目视检查、修改或由另一个程序生成。然后程序可以加载文件,获取每一行,解析出相关参数,将它们提供给 Car(string name, int speed, uint color) 构造函数并创建对象。

请注意在与构造函数兼容之前必须对输入做一些工作:必须通过调用将速度从 string 转换为 intint.Parse。颜色必须通过查找英文颜色名称与 RGB 值相匹配(也许程序会访问维基百科来找出每种颜色的值,或者在某处查阅名称 -> RGB 的预定义映射)。

我的问题是,从 OOP 的角度来看,应该由谁来执行此解析?构造函数,还是调用构造函数的方法?

第一个选项的优点是简单。调用函数只能做:

foreach(var row in input_file)
     list_of_objects_that_i_am_populating.Add(new Car(row));

所有丑陋的解析都可以很好地包含在构造函数中,无论如何它没有太多其他代码,因此可以轻松阅读和修改解析代码,而不会被非解析代码分心。

缺点是代码重用已经过时了,因为现在我的对象被加入到输入格式中(更糟糕的是,因为输入格式是临时的和手动组合的,它是短暂的并且可能不能保证保留相同)。如果我在另一个程序中重用这个对象,我认为稍微更改输入文件的格式很方便,那么对象定义的两个版本现在是不同的。我经常发现自己在构造函数的注释部分定义输入格式,这似乎有点代码味。

另一个缺点是我已经失去了批量操作的能力。回想一下前面将颜色名称映射到值的示例问题:如果我使用的 Web 服务需要 1 分钟来处理每个单独的请求,无论该请求是要求转换一个颜色名称还是一百万个。对于非常大的输入文件,我会通过为每一行访问一次服务来大大降低我的应用程序的速度,而不是为所有行提交一个大请求,然后根据回复实例化对象。

处理这种情况的“正确”方法是什么?我是否应该解析输入构造函数并将上述问题视为必须逐案处理的异常问题?我是否应该让我的调用方法进行解析(即使它可能已经被许多复杂的程序逻辑弄得臃肿)?

最佳答案

My question is, from an OOP standpoint, who should do this parsing? The constructor, or the method calling the constructor?

一般来说,你应该避免在构造函数中这样做。这将违反 Single Responsibility Principle .每种类型应仅负责该类型内所需的操作,而不负责其他任何操作。

理想情况下,一个单独的类将负责将数据解析为正确的形式(而不是别的)。创建您的实例的方法将采用该(解析的)数据并创建您的类型。

关于c# - 构造函数应该解析输入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20980450/

有关c# - 构造函数应该解析输入吗?的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  4. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  5. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  6. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  9. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  10. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

随机推荐