Questions tagged «design»

有关通过软件设计解决问题和计划解决方案的问题。

9
只有一个(公共)方法的类是否有问题?
我目前正在从事一个软件项目,该项目对视频监控镜头进行压缩和索引编制。压缩的工作方式是分割背景和前景对象,然后将背景另存为静态图像,并将前景另存为子画面。 最近,我开始复习我为该项目设计的一些课程。 我注意到有许多类只有一个公共方法。其中一些类是: VideoCompressor(使用一种compress方法,该方法接收类型的输入视频RawVideo并返回类型的输出视频CompressedVideo)。 VideoSplitter(使用一种split方法,该方法接收类型的输入视频RawVideo并返回2个输出视频的向量,每个类型均为RawVideo)。 VideoIndexer(使用index接收类型为type的输入视频RawVideo并返回类型为video的视频索引的方法VideoIndex)。 我发现自己实例每个班只是为了让像电话VideoCompressor.compress(...),VideoSplitter.split(...),VideoIndexer.index(...)。 从表面上看,我确实认为类名足以说明其预期功能,实际上它们是名词。相应地,它们的方法也是动词。 这真的有问题吗?

2
与MVC相比,MVP有哪些改进?
我已经阅读了三天的有关Model-View-Controller(MVC)和Model-View-Presenter(MVP)模式的信息。有一个问题令我非常困扰。当已经有MVC时,为什么软件设计者会发明MVP? 他们遇到了什么问题,MVC无法解决(或解决得很差),但是MVP可以解决?MVP打算解决哪些问题? 我已经阅读了很多有关MVP的历史和解释,或者关于MVC和MVP之间差异的文章,但是没有一个对我的问题有明确的答案。 在我读过的一篇文章中,有人说: 现在进入Model View Presenter,这是对MVC模式应用于现代基于组件的图形用户界面时的不足之处的回应。在现代GUI系统中,GUI组件本身而不是某些中央控制器来处理诸如鼠标移动和点击之类的用户输入。 因此,我听不懂,但实际上可以以另一种方式使用,例如GUI组件不能自行处理用户输入吗?“单独处理”到底是什么意思?

7
具有相同成员但命名不同的两个结构,这是一个好主意吗?
我正在编写一个涉及极坐标和笛卡尔坐标的程序。 为每种类型的点创建两个不同的结构是否有意义,一个结构与X和Y成员,一个结构与R和Theta成员。 还是太多了,最好只有一个结构体,first并second作为成员。 我写的内容很简单,不会有太大变化。但是我很好奇从设计的角度来看哪个更好。 我认为第一种选择更好。似乎更具可读性,我将获得类型检查的好处。
49 design 

6
许多小请求与几个大请求(API设计)
我目前正在与一个组织一起从事以下项目: 客户端 -通过REST API从主服务器获取数据。 服务器 -通过第三方API向其他各种服务器请求数据 第三方API-无法控制的向服务器提供数据的服务(Reddit,Hackernews,Quora等) 出于争论的目的,假设客户端首先需要每个第三方API的项目列表。从该列表中,将选择一个项目,此时客户需要查看该项目的全部内容以及对该项目的响应(即评论)。我试图在三个选项之间做出选择: 点菜 用这种方法,我的服务器上将有3个单独的端点:一个用于获取项目列表,一个用于获取项目的主要内容,以及一个用于获取项目的响应。 优点:我从来没有发出比我需要更多的请求,请求应该很小,因此通常它们应该更快。 缺点:我必须提出很多要求。从列表中选择一个项目后,用户可能必须先等待才能看到主要内容,然后再等待更长的时间才能看到响应 服务器端缓存 在此请求中,我将对服务器进行一次调用以“获取”所有源的所有数据。然后,数据将被缓存在服务器上。然后,客户端将具有与以前相同的REST终结点,但是在两次调用之间不会有太多等待,因为我的服务器已经拥有了数据,只需要将其提供给客户端即可。 优点:仍然易于在客户端实现,但没有延迟问题 缺点:更多涉及服务器端,第一次调用可能要花很长时间。 客户端缓存 除了客户端只向服务器发出一个请求外,此方案与上一个相似:将所有数据提供给我。从这里开始,客户有责任保存数据并正确使用它们。 优点:易于服务器实施,在首次通话后非常快速 缺点:第一次调用将非常缓慢,客户端实现更为复杂 我不确定哪种方法是最好的,或者不确定是否缺少明显的解决方案。任何建议将不胜感激!

14
使用反射是否有问题?
我不知道为什么,但是当我使用反射时,我总是觉得自己在“作弊”-也许是因为我知道我要表现出色。 我的一部分说,如果它是您正在使用的语言的一部分,并且可以完成您尝试做的事情,那么为什么不使用它呢?我的另一部分说,必须有一种无需使用反射即可执行此操作的方法。我想也许这取决于情况。 使用反射时需要注意哪些潜在问题,我应该如何关注它们?尝试寻找更常规的解决方案需要花费多少精力?

19
在大型站点上服务后台任务
我们正在处理StackOverflow上一个有趣的问题。 我们有一堆小的“需要尽快完成的任务”。一个示例是更新“相关问题”列表。过去我们所做的是将这些任务附加到某些用户的页面加载中。 这从来都不是理想的,但并不是很明显。现在,SO已经超过了1,000,000个问号,那些不幸的用户开始感觉到它。 自然的解决方案是将这些任务实际推入后台。我正在考虑有两种广泛的方法可以做到这一点。 1.在IIS中作为自定义线程池/工作队列 基本上,我们启动了几个(非ThreadPool,以便不干扰IIS)线程,并使它们服务于我们将Funcs推入的某些集合。 这里的最大优点是简单性。我们不必担心会封送任何东西,也不必确保某些外部服务正常运行并做出响应。 我们还可以访问所有通用代码。 缺点是,我们不应该使用后台线程。我知道的反对意见都集中在饥饿的IIS(如果使用ThreadPool)和线程随机死亡(由于AppPool回收)的问题上。 我们已经有了现有的基础架构来使随机线程死亡成为非问题(基本上可以放弃检测任务的可能性),并且限制线程数量(并使用非ThreadPool线程)也不难。 我是否在IIS进程线程池/工作队列中缺少其他任何反对意见? 已移至StackOverflow,因为此处未真正解决。 2.作为服务 某些第三方解决方案或定制解决方案。 基本上,我们会将任务跨流程边界编组到某个服务,而不必理会它。大概我们是在某些代码中链接原始代码,或者将它们限制为原始SQL +连接字符串。 优点是这样做的“正确方法”。 缺点是我们要么只能做有限的工作,要么必须制定一些系统来使该服务与我们的代码库保持同步。我们还需要以某种方式挂钩所有监视和错误日志记录,这些都是通过“ In IIS”选项免费获得的。 服务方法还有其他好处或问题吗? 简而言之,是否存在无法预见和无法克服的问题,从而使方法1变得不可行,如果是的话,我们是否应该寻求方法2的良好第三方服务?

9
管理器类是否可以作为不良体系结构的标志?
最近,我开始认为在您的设计中拥有很多经理类是一件坏事。这个想法还不够成熟,我无法提出令人信服的论点,但这里有几点要点: 我发现,要理解高度依赖“经理”的系统要困难得多。这是因为,除了实际的程序组件之外,您还必须了解使用管理器的方式和原因。 在很多时候,管理人员似乎常常被用来缓解设计问题,例如当程序员找不到一种方法来制作程序Just Work TM并不得不依靠管理人员类来使一切正常运行时。 当然,马槽可能很好。一个明显的例子是EventManager,这是我一直以来最喜欢的结构之一。:P我的观点是,经理似乎经常被滥用,除了掩盖程序体系结构的问题外,没有其他充分的理由。 经理班真的是不良建筑的标志吗?


6
隐藏的AJAX请求伪造性能有多安全?
什么是隐藏的AJAX请求? 我注意到,旨在使用户操作立即发生的隐藏AJAX请求的使用率有所增加。我将这种类型的AJAX请求称为非阻塞。这是一个AJAX请求,用户没有意识到它正在发生,它是在后台执行的,它的操作是无声的(没有冗长的指示AJAX调用已成功完成)。目的是使操作看起来确实在尚未真正完成时立即发生。 这是非阻塞AJAX请求的示例; 用户单击电子邮件集合上的删除。这些项目会立即从其收件箱中消失,并且可以继续进行其他操作。同时,AJAX请求正在后台处理项目的删除。 用户填写新记录表格。单击保存。新项目将立即显示在列表中。用户可以继续添加新记录。 为了澄清起见,下面是阻止AJAX请求的示例; 用户单击电子邮件集合上的删除。出现沙漏光标。发出AJAX请求,并在响应时关闭沙漏光标。用户必须等待一秒钟才能完成操作。 用户填写新记录表格。单击保存。带有AJAX加载程序动画的表格会变成灰色。显示一条消息“您的数据已保存”,新记录出现在列表中。 上述两种情况之间的区别在于,非阻塞AJAX设置不提供操作执行的反馈,而阻塞AJAX设置提供。 隐藏的AJAX请求的风险 此类AJAX请求的最大风险是,当AJAX请求失败时,Web应用程序可能处于完全不同的状态。 例如,一个非阻塞示例; 用户选择一堆电子邮件。单击删除按钮。该操作似乎立即发生(项目从列表中消失)。然后,用户单击“撰写”按钮,并开始输入新电子邮件。这时JavaScript代码发现AJAX请求失败。该脚本可能会显示错误消息,但目前确实没有意义。 或者,一个阻塞的例子; 用户选择一堆电子邮件。单击删除按钮。看到一个沙漏,但是操作失败。他们收到一条错误消息,说“错误。等等等等”。它们将返回到电子邮件列表,并且仍然具有要删除的电子邮件。他们可以尝试再次删除它们。 执行非阻塞AJAX请求还存在其他技术风险。用户可以关闭浏览器,可以导航到另一个网站,并且他们可以导航到当前网络中的另一个位置,这使得任何错误响应的上下文都变得毫无意义。 那么为什么它变得如此受欢迎? Facebook,Google,Microsoft等。等等。所有这些大型域越来越多地使用非阻塞AJAX请求来使操作看起来像是立即执行的。我还看到没有保存或提交按钮的表单编辑器有所增加。离开字段或按Enter键。该值已保存。没有您的个人资料已更新消息或保存步骤。 AJAX请求不是确定的,在完成之前不应被视为成功,但是许多主要的Web应用程序正像这样运行。 这些使用非阻塞性AJAX调用来模拟响应式应用程序的网站是否冒着快速出现的代价冒着不必要的风险? 为了保持竞争力,我们所有人都应该遵循这种设计模式吗?

3
哪种更好的做法-辅助方法是实例还是静态?
这个问题是主观的,但是我很好奇大多数程序员是如何做到这一点的。下面的示例使用伪C#,但这也应适用于Java,C ++和其他OOP语言。 无论如何,当在我的类中编写辅助方法时,我倾向于将它们声明为静态方法,并且仅在辅助方法需要它们时才传递字段。例如,给定以下代码,我更喜欢使用方法调用#2。 class Foo { Bar _bar; public void DoSomethingWithBar() { // Method Call #1. DoSomethingWithBarImpl(); // Method Call #2. DoSomethingWithBarImpl(_bar); } private void DoSomethingWithBarImpl() { _bar.DoSomething(); } private static void DoSomethingWithBarImpl(Bar bar) { bar.DoSomething(); } } 我这样做的原因是,它使(至少在我看来)清楚地知道了helper方法可能对其他对象产生副作用-即使没有阅读其实现方法。我发现我可以快速掌握使用该实践的方法,从而帮助我进行调试。 您更喜欢在自己的代码中执行哪些操作?这样做的原因是什么?

3
与基于类的OOP相比,基于原型的OOP有何优势?
当我主要在基于类的语言的上下文中处理OOP之后第一次开始对Javascript进行编程时,我对为什么基于原型的OOP会比基于类的OOP更为困惑。 使用基于原型的OOP的结构优势是什么?(例如,在某些应用程序中,我们希望它更快或更省内存吗?) 从编码人员的角度来看,优点是什么?(例如,使用原型制作某些应用程序或扩展其他人的代码是否容易?) 请不要把这个问题看做是关于Javascript的问题(多年来存在很多与原型无关的错误)。相反,请结合原型与类的理论优势来研究它。 谢谢。


10
对您接受的东西持开放态度吗?
[免责声明:这个问题是主观的,但我希望得到事实和/或反思的支持] 我认为每个人都知道“ 稳健性原则”,通常用Postel定律来总结: 保守发送的内容;在接受的内容上保持自由。 我同意,对于设计广泛的通信协议,这可能是有道理的(目的是允许轻松扩展),但是我一直认为,将其应用于HTML / CSS完全是失败的,每个浏览器都执行自己的无声调整检测/行为,几乎不可能在多个浏览器中获得一致的渲染。 我确实注意到,除非另有说明,否则TCP协议的RFC认为“ Silent Failure”是可以接受的……至少可以说这是一种有趣的行为。 在整个软件行业中,还有其他一些应用此原理的示例,这些示例经常出现,因为它们已经咬住了开发人员,从我的头顶开始: JavaScript分号插入 C(静默)内置转换(如果不被截断的话,还算不错……) 并且有一些工具可以帮助实现“智能”行为: 名称匹配语音算法(Double Metaphone) 字符串距离算法(Levenshtein距离) 但是,我发现这种方法虽然在与非技术用户打交道或在错误恢复过程中帮助用户时可能会有所帮助,但在应用于库/类接口的设计时仍存在一些缺点: 该算法是否猜测“正确”在一定程度上是主观的,因此可能违反最小惊讶原则 它使实施更加困难,从而增加了引入错误的机会(违反YAGNI吗?) 它使行为更易于更改,因为对“猜测”例程的任何修改都可能破坏旧程序,几乎从一开始就排除了重构的可能性! 这就是导致我提出以下问题的原因: 在设计接口(库,类,消息)时,您是否倾向于健壮性原则? 我本人往往很严格,在我的界面上使用了广泛的输入验证,我想知道自己是否太严格了。
45 design 

7
系统可以100%进行数据驱动吗?
我的新老板已经在这个项目上工作了很多年。我只来过这里几个星期,但我不确定是否有可能。他想设计一个“ 100%数据驱动”的系统。 因此,如果我们输入足够的数据,则可以定义并生成任何应用程序。我至少设法让他承认某些事情,例如用户,或者应用程序应该具有预定义的值,但是他喜欢系统结构,用户界面和逻辑都存储为数据的概念。 这里有一些简单的演示,他基本上重新发现了一些面向对象编程和基本模板系统的简单想法,但总的来说,我认为这个目标实际上是不可能的。 我不知道如何在不使系统变得如此复杂以至于无法进行实际编程的情况下使用数据定义逻辑。 我认为从理论上讲,这不是因为解释数据的内容最终需要完整描述应用程序,因此您只是将问题上移了一层,甚至没有任何净收益。 这样的100%数据驱动应用程序有可能吗?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.