软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

1
REST API中链接rel =“ self”的意义是什么?
我经常在HTML文档中看到以下内容 <link rel="self" href="http://example.com/something"> 或像这样的JSON link: { rel="self", href="http://example.com/something" } 或XML <atom:link rel="self" href="http://example.com/something" /> 所以我有一些问题: 为什么要包含此链接?它带来什么好处?(请告诉我这是有原因的,而不仅仅是“好的做法”护身符) 如何在客户中利用此链接?此链接的用例是什么? 我什么时候不应该使用此链接?什么时候包括它毫无意义?
11 rest  web-api 

3
我们应该在何时何地使用Java吊装[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我是Java的新手。我正在学习用Java语言吊装的概念。 根据Mozilla网站上的Javacsript教程,我碰到了这个词hoisting。根据这些教程,JavaScript中的变量是您可以引用以后声明的变量,而不会出现异常。但是,我的问题是在哪种情况下在客户端Javascript中使用卷扬是合适的,或者为什么我们应该在Javascript中使用卷扬。有什么优点。
11 javascript 

3
破坏参考透明度的副作用
Scala中的函数式编程说明了副作用对破坏引用透明性的影响: 副作用,这意味着违反了参照透明性。 我已经阅读了SICP的一部分,其中讨论了使用“替代模型”评估程序。 当我大致了解具有引用透明性(RT)的替换模型时,可以将函数分解为最简单的部分。如果表达式是RT,则可以分解表达式并始终获得相同的结果。 但是,正如以上引用所述,使用副作用可能/将破坏替代模型。 例: val x = foo(50) + bar(10) 如果foo和bar 没有副作用,则执行任一函数将始终将相同结果返回x。但是,如果它们确实有副作用,它们将更改一个变量,该变量会破坏/投入替代模型。 我对这个解释感到满意,但是我并没有完全理解它。 请纠正我,并填写有关破坏RT的副作用的所有漏洞,并讨论对替代模型的影响。

8
如何在不向竞争对手公开秘密的情况下安全地调试PHP Web应用程序?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 最近我做了一个程序。我忘记删除2行代码。这个错误每天使我每天损失$ 800。 我当时在用PHP编程。如果访问者使用代理,它将重定向到其他地方。使用调试器是不可能的,因为某些代码包含ioncube。由于该程序无论如何都只是重定向到其他地方,因此很难看到代码的哪一部分被执行。 所以我到处都放了一堆调试信息。我以为我以后还是要删除它们。 当然,最自然的调试方法是将调试信息放入文件中。问题是我经常使用代理。因此,在更改程序后,我经常必须使用filezilla下载文本文件。通常,文本文件没有显示我认为应该显示的内容。最后,我决定只在网络上显示错误。 我考虑过使用调试模式。但是,恐怕我会忘记删除调试信息。 例如,如果用户执行?debuggingmode = 1,我考虑使用调试模式。但是,我对自己的竞争对手以某种方式可以猜出secret关键字感到疑惑。 我删除了大多数调试信息。我忘记删除一个,并且只有在用户使用来自正确国家/地区的代理服务器时才会显示一个。原来我没有来自正确国家/地区的代理,也没有意识到这一点。该程序运行24小时后,我将其上传到了我的主域。 我的竞争对手,使用代理,请参阅调试代码。他抄袭了这个主意,这就是我每天损失800美元的原因。 回想起来,我真的很难知道我哪里出了问题。我一直非常小心。却发生了。 如何在不向竞争对手公开秘密的情况下安全地调试PHP Web应用程序?
11 php  debugging 

3
什么时候应该修剪输入?
我正在学术界之外大量学习有关行业的知识。 我今天想到的一件事是削减输入。 一方面,我不希望用户/实现者不断收到意想不到的结果,因为它们的输入空间太大,因此我需要在每次函数调用后不断调整用户输入。 但是同时,如果我要在办公室内部创建一个供内部使用的API库,则尾随/前导空格可能对结果至关重要。 然后有一些实例,我不确定空格是否重要。 对我来说,最大的问题是我发现自己在代码中的任何地方都不断地调用.trim()。 是否有人对如何处理某些情况有任何技巧或经验法则?

2
.NET MVC项目体系结构/分层
在为中型MVC Web应用程序规划体系结构时,如何实现这些层尽可能地分离和易于测试?(基本上遵循最佳实践)假设我首先使用代码作为数据访问权限。 我为定义“业务逻辑”的定义以及与数据层交互的方式感到困惑。以车辆销售应用程序为例,业务逻辑是否是执行诸如计算给定车辆的税阶,比较每加仑英里数统计信息之类的任务的类?至于业务实体(例如汽车,货车,摩托车),我会将它们与DataContext班级一起放在数据层中。 还有什么会构成与业务相对的应用程序逻辑-我正在猜测会话/用户输入验证之类的东西? 因此,例如,汽车管理员可能会返回一个操作/查看结果,其中列出了按类型和最佳mpg过滤的前十名汽车。假设我有一个ICarRepository“ carRepo”注入到我的控制器中(使用存储库模式/ DI),我从一个动作方法参数中过滤了我的汽车var cars = carRepo.getCarsByType("hatchback"); 因此,我已使用存储库将数据访问知识排除在控制器之外,现在使用域模型将业务逻辑排除在控制器之外-var result = new MpgCalculator(cars); -假设我需要计算器类,因为它需要执行其他逻辑以计算最佳燃油效率,而不仅仅是从数据库中加载/过滤实体。因此,现在我有了一个供呈现的视图数据集,该数据集使用存储库从数据访问层检索,并且使用特定于域的对象来处理和执行与数据相关的业务相关任务。 我在这里犯错吗?我们仍然需要使用存储库模式吗?或者我可以只对接口进行编码以解耦ORM和进行测试吗?关于这个主题,因为我的具体数据访问类dbcontext在数据层中,所以接口定义是否应该进入域/业务层,这意味着如果数据访问技术发生了变化,我的其他层是否会受到影响? 根据到目前为止的研究,我的结构如下所示: MVC Internet应用程序 ->标准Internet项目-这里的模型是ViewModels 域/业务层 ->特定于业务的类/模型,控制器可以使用这些类/模型来处理数据层中的域实体,然后再传递到相关视图 存储库抽象有必要吗?->我听到很多关于此的辩论,尤其是在使用ORM时 数据层 ->实体类(汽车,货车,摩托车),DbContext-具体数据访问技术层

3
通过HTTP标头传输访问令牌是否安全?
这是第一个RESTful Web服务,我担心安全性问题。通过HTTP标头传输访问令牌是否安全?例如: POST /v1/i/resource HTTP/1.1 Content-Type: application/x-www-form-urlencoded Api-key: 5cac3297f0d9f46e1gh3k83881ba0980215cd71e Access_token: 080ab6bd49b138594ac9647dc929122adfb983c8 parameter1=foo&parameter2=bar 连接已建立SSL。另外,需要定义什么作为scope每个属性access token

3
使用用户权限存储菜单项
我正在用PHP和MySQL创建菜单系统。我将有几个不同的菜单,每个菜单都将具有一组与其连接的菜单项。 在该网站上,我还具有不同的用户权限,有些用户可以看到所有菜单项,有些项目对某些用户是隐藏的。我很好奇如何以一种干净的方式处理权限,将来可以轻松添加更多类型的用户。 到目前为止,我有这样的事情: ------------------- |Menus ------------------- |id| |display name| ------------------- ---------------------------------------------------------- |Menu items ---------------------------------------------------------- |id| |menu_id| |label| |link| |parent| |sort| |permission| ---------------------------------------------------------- 我在想该permission列可能是一个逗号分隔的字符串,我可以将其与当前用户的权限ID进行匹配。它也可能是对其他一些表的引用,该表定义了当前现有权限的所有可能组合。 一种解决方案也可以是简单地存储多个菜单项,唯一的区别是权限,尽管这将导致重复存储,并且可能给管理带来麻烦。 我很想听听有关如何组织这个以及什么可以被认为是干净,动态和dynamic脚的思考。 谢谢。

1
通用列表处理功能名称的由来
重复采用或重新发明了一些用于对列表或数组进行操作的高阶函数。功能映射,折叠 [ l | r ]和filter是在几种编程语言中一起发现的,例如Scheme,ML和Python,它们似乎没有共同的祖先。我将使用这三个名称来使问题集中。 为了表明名称不是通用的,这里是其他语言等效功能的名称示例。C ++ 转换而不是map,而remove_if而不是filter(颠倒了谓词的含义)。Lisp使用mapcar代替map,使用remove-if-not代替filter,并用reduce代替fold(某些现代Lisp变体具有map,但这似乎是派生形式。)C#使用Select代替map,而Where代替过滤器。C#的名称来自SQL,是通过LINQ进行的,尽管更改了名称,但其功能却受到Haskell的影响,而Haskell本身也受到ML的影响。 map,fold和filter的名称很普遍,但并不通用。这表明它们是从有影响力的来源借用到其他当代语言的。这些函数名称从何而来?

3
TDD模拟呼叫验证-是反模式吗?
我已经进行了一年的TDD测试,对此我感觉很好,我喜欢我的测试套件以及所有其他工具。但是,我注意到最近我一直在做很多模拟通话验证。例如,我有一个将注入存储库的服务-在我的单元测试中,我将传递一个存储库的模拟并验证它在我正在测试的方法中被调用。然后,我将检查返回的结果是否正确(在另一个测试中)。这绝对是“感觉”错误,因为我的单元测试现在与实现细节非常相关。我听说您应该测试“行为”,但是在许多情况下……嗯-不可能吗?如果你有一个void例如,您通常会测试副作用。我的意思是继续进行并展示一些简单的代码集很容易就能证明这一点,但是恕我直言,它不能很好地反映我们编写的真实程序。我做错了吗?这种测试是一种反模式吗?感谢您对此的意见,在TDD方面,我还是一个新手。

2
定价产品的数据库架构(打包,促销,基于数量,限时提供…)
我正在为一家公司提供新的销售点,该公司根据产品组合提供不同的价格。 所有产品都有底价。 为了解释我的问题,我将使用以下信息: Product Category Price A 1 45 B 1 70 Q 2 20 R 2 27 S 2 15 X 3 17 Y 3 22 Z 3 16 该公司有Packages,例如Package“ Combo”:对于产品A或B,如果选择Q或R中的1个以及X,Y或Z中的1个,则可享受$ 20的折扣。 案例A:有时客户在下订单时会添加基本产品,例如:他们不使用产品A,而是在其中添加产品Q和产品P以创建打折的包装。然后,他们可能会补充说,他们想要1个具有1 R和1 Z的乘积B。 情况B:有时客户会添加1 A和2 B,2 Q,1 S,2 X和1Z。根据“组合”程序包规定的规则,由于S不是组合项目,因此仅适用2个组合。 其他促销取决于数量,因此,如果您购买2件B,您将获得20%的折扣和/或取决于时间,该促销仅在下午5点之后有效,或者如果在上午10点之前折扣10%之前有效。另一个促销活动可能取决于您上次购买的时间或您在Y时间范围内的购买金额是否超过$ X。 我的问题: 1)如何构造表,以便以非常灵活的方式创建不同的包装或促销以添加具有不同要求的不同类型的促销? 2)当他们像案例B(或案例A和案例B的混合商品)那样订购时,如何构造查询,以便测试订单中有哪些商品组合,并相应地更新价格/说明?最终,此查询的最佳结果将返回满足要求的包装和促销,从而给客户带来最大的利益(即,他们订购的产品满足促销1和促销3的要求,但是促销3的价格更低。必须与多个促销一起使用)。 先谢谢您的帮助! 更新1 为了更好地描述手头的问题并更新迄今为止为解决这些问题而完成的工作,我将产品模型的ERD限于影响该问题的实体和属性(即,此处没有库存,因此没有库存)实体存在)。 …


2
麻省理工学院执照:为什么它不被认为是病毒?
许可证的第一部分意味着您基本上可以使用许可证进行任何操作(复制,修改,出售等)。但是第二部分说这些自由必须传播到软件的所有副本中。 我的解释是,您可以将软件合并到您的专有项目中,但是该部分必须保持开放....因此,对软件的任何修改都必须保留该许可证,以强制我进行更改以开源。 这不是人们认为GPL具有限制性/病毒性的原因吗?因为它强制修改要开源? 这是许可证的副本: 特此免费授予获得此软件和相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用,复制,修改,合并的权利,发布,分发,再许可和/或出售本软件的副本,并允许具备软件的人员这样做,但须满足以下条件: 上述版权声明和此许可声明应包含在本软件的所有副本或大部分内容中。 本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性,特定目的的适用性和非侵权性的保证。无论是由于软件,使用或其他方式产生的,与之有关或与之有关的合同,侵权或其他形式的任何索赔,损害或其他责任,作者或版权所有者概不负责。软件。

4
Java的主要重点是什么?为什么要花这么长时间才能获得新功能?
我一直在探索JDK8中的新功能,例如lambda表达式,扩展方法和新的流API。 显然,这些功能都不是编程世界中的新增功能,这使人们感到奇怪的是,为什么到目前为止在Java中都无法获得所有这些功能。 Lisp(1958),SML(1973),Haskell(1990),Python(1991),JavaScript(1994),Ruby(1995),Scala(2003),C#(2007)和Lisp和55年后有lambda表达式Java(2013)中几乎所有其他人。 我在SIC(1996年)中读到有关流的信息。 我一直在想为什么现在呢?有证据表明,与其他语言竞争不是动机。 看来,此Java版本中的所有很酷的新功能只是实现并行性的副产品。我们之所以拥有lambda,是因为它们使编写并行算法变得更加简单,而我们拥有扩展方法,是因为我们需要它们来支持lambda表达式所需的更改等。 因此,我的问题是:我们能否安全地确认即将发布的Java版本中的主题实际上是并行性?还是我们可以证明迄今为止使用Java编写本书中最古老的技巧的其他原因?


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.