草庐IT

java - "master preferences"类是个好主意吗?

coder 2024-03-10 原文

我有一个管理大型软件项目的用户首选项的类。项目中可能需要从持久存储中设置或检索用户首选项的任何类都将调用此类的静态方法。这种集中管理允许以编程方式完全删除首选项 - 如果每个首选项都在接近其使用代码的地方处理,散布在整个项目中,这是不可能的。

我在这个过程中遇到了中心化设计的另一个含义。该软件有一个公共(public) API。该 API 可以在 jar 中自行提供。该 API 中的类可能引用 pref 管理类。因此,pref 管理器必须放在 API jar 中。

每个首选项都可能有一个默认值。在软件启动时,可能会计算该默认值。该算法取决于偏好,因此倾向于驻留在使用代码附近。因此,如果 pref 管理器需要提供默认值,它会调用相关类。

但现在 pref 管理器已经变成了一个“ Octopus 类”,将各种不应该存在的类吸入 API jar 中。如果没有,那么使用 API jar 的程序很快就会遇到 ClassDef 异常。如果是这样,那么 API jar 现在就膨胀了,因为每个其他类都可能引用其他类。

一般来说,其他 Java 程序员是否使用集中式类来管理他们的偏好?

将静态 pref 管理类作为公共(public) API 的一部分分发是否有意义?

pref 管理者是否应该负责确定默认值的代码?

最佳答案

恕我直言,我认为您第一个问题的答案是"is"和“否”。

首选项通常作为集中式处理,因为该类是项目中许多类的“接收器”。尝试将其靠近调用代码意味着如果相同的首选项稍后在其他地方有用,那么您就有麻烦了。根据我的经验,尝试将首选项“靠得太近”也会导致处理非常不一致。

也就是说,通常最好使用多个首选项类或“首选项集”,每个首选项类或“首选项集”都支持一个模块或子模块。如果您查看架构的主要组件,您通常会发现首选项集可以在逻辑上进行分区。这减少了每个偏好类别中的困惑。更重要的是,它将允许您在将来将您的程序拆分到多个 jar 中。现在,“默认值”计算器可以放置在模块中,但仍处于足够全局的区域中。

我还建议不要直接将首选项设置为静态方法,而是使用一些类似于 getInstance() 的操作来获取首选项管理的共享实例,然后对其进行操作。根据您的语义,您可能希望锁定该对象一段时间(例如,当用户正在 UI 中编辑首选项时),如果您有一个实际对象,这会更容易。

对于您的其他问题,我会说您的公共(public) API 应该有一种让用户更改首选项的方法,但前提是您可以足够好地记录这些更改的结果。

如果您使用单个 API 函数来获取“引用管理器”,则可以为用户提供提供他们自己的“默认值计算器”的可能性。偏好管理器会先询问此计算器,然后再使用您默认提供的计算器。

关于java - "master preferences"类是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/592960/

有关java - "master preferences"类是个好主意吗?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

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

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

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  9. 通过 MacPorts 的 RubyGems 是个好主意吗? - 2

    从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装ruby​​gems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐