软件工程

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

2
注册期间自动生成密码是一个好主意吗?
我正在为我正在从事的项目开发注册系统。 由于如果过程太长,用户往往不愿注册,所以我认为(至少最初需要)他们的电子邮件,然后将自动生成的密码发送给他们(这也使我可以验证他们的电子邮件地址) )。这也将阻止他们选择较弱的密码来快速完成注册。 到目前为止,我还没有发现任何弊端,但是由于我从未见过使用该系统的站点,因此恐怕还有一些弊端。 这是一个好主意吗? PS:当然,我也正在通过Facebook和其他类似服务实施注册,以使人们无需密码即可快速注册,但许多人可能出于隐私考虑或因为他们不愿意而选择经典注册使用任何这些服务。

6
如何在switch语句中减少switch?
因此,我正在基于数据库中的两个人创建一种称呼行的方法。 有四个参数:两个名称(name1和name2)和两个性别(gender和gender2)。 对于每种性别组合,我都有不同的输出。 例如:如果性别1为M(man)且性别2也为M,则输出应为: Dear Sir name1 and Sir name2, 此时,我的开关如下所示: switch(gender1){ case 'M': switch(gender2){ case 'M': printf("Dear Sir %s and Sir %s", name1, name2); break; case 'W': printf("Dear Sir %s and Madame %s", name1, name2); break; case 'R': ... } break; case 'W': switch(gender2){ case 'M': printf("Dear Madame %s …

1
unum如何模拟IEEE的负零?
我目前正在阅读John Gustafson(Youtube)的“错误的终结-统一计算” 。我仍然不确定如何用unums 处理在IEEE中由负号零处理的情况。 因此,首先,unum可以表示某些精确值(类似于浮点数),还可以表示在精确值(包括精确的-∞和∞)之间的开放区间。因此,完整的实线由交替的精确值和开放时间间隔表示: -∞,(-∞,-maxreal),-maxreal,... -smallsubnormal,(-smallsubnormal,0), 0, (0,smallsubnormal),smallsubnormal,... maxreal,(maxreal,∞),∞ 以这种方式(在IEEE传统中)异常值(例如下溢和上溢)只是一些开放时间间隔。换句话说:这些以前特殊的条件现在变成常规情况。 IEEE的-∞对应于{-∞}和(-∞,-maxreal)的并集。 现在,有符号零可能是时间间隔(-smallsubnormal,0)和(0,smallsubnormal)。 但是,1 /(-smallsubnormal,0)现在是(-∞,-maxreal),而不仅仅是-∞。而1/​​0是∞。 我仍然犹豫的是在IEEE -0和+0比较中相等。但他们不是没有共同点。似乎映射不是100%。因此,我想知道是否存在可能出现差异的极端情况((以及这些情况是否确实相关))。 (我知道为什么负零很重要?, 用于负浮点值)

2
我们需要验证整个模块的使用情况还是仅验证公共方法的参数?
我听说建议您验证公共方法的参数: 如果他不期望为空,是否应该检查为空? 方法是否应验证其参数? MSDN-CA1062:验证公共方法的参数(我具有.NET背景,但问题不是特定于C#的) 动机是可以理解的。如果将以错误的方式使用模块,则我们希望立即引发异常,而不是任何不可预测的行为。 令我困扰的是,错误的参数并不是使用模块时唯一的错误。这是一些错误情况,如果我们遵循建议并且不希望错误升级,则需要添加检查逻辑: 来电-意外参数 来电-模块处于错误状态 外部通话-返回意外结果 外部调用-意外的副作用(两次进入调用模块,破坏了其他依赖状态) 我试图考虑所有这些情况,并用一种​​方法(对不起,不是C#的人)编写一个简单的模块: public sealed class Room { private readonly IDoorFactory _doorFactory; private bool _entered; private IDoor _door; public Room(IDoorFactory doorFactory) { if (doorFactory == null) throw new ArgumentNullException("doorFactory"); _doorFactory = doorFactory; } public void Open() { if (_door != null) throw …



3
REST是否仅限于乐观并发控制?
语境 由于REST体系结构样式的无状态性(涉及每个请求完全独立),导致服务器从不存储有关客户端的任何信息。 因此,悲观并发控制不合适,因为这将要求服务器存储哪个客户端获得资源锁定。然后在Etag标头的帮助下使用乐观并发控制。(顺便说一句,正如我在那儿问的/programming/30080634/concurrency-in-a-rest-api) 问题 乐观并发控制机制的主要问题在于,您始终允许所有客户端执行任何操作。 我想避免这种情况,而不会破坏REST的无状态原则。我的意思是,所有客户端都无法随时执行任何操作。 题 在我看来,采用半乐观并发控制机制是可能的,例如: 客户可以请求令牌 只能生成一个令牌,并且有效期有限 要对资源(例如POST或PUT)执行操作,客户端必须将此令牌作为请求正文(或标头?)的一部分提供。没有令牌的客户端无法执行这些操作。 它与开放式并发控制非常相似,不同之处在于,只有一个客户端可以执行某些操作(获得令牌的操作)……与“所有客户端可以执行所有操作”相反。 这种机制是否与REST架构风格兼容?它打破了它的任何约束吗?我当时想问一下SO,但这似乎是一个与软件设计有关的高级问题。


8
是什么阻止了C的编译/解释/ JIT处理?
Java经常以其惊人的可移植性而受到赞誉,我认为这是因为JVM。我的问题是阻止C进行编译/解释/ JIT的原因是什么,如果是这样,C也可以编写一次并使其在您拥有的任何设备上工作。但这不是处理C程序的流行机制。 用这种方式处理C的缺点是什么,当然除了可移植性以外,用这种方式处理Java而不编译为机器代码的优点是什么?

4
如何在不强制进行层次结构的情况下使对象彼此交互和通信?
我希望这些问题能使我的问题更清楚-但是,我完全理解它们是否愿意,所以请让我知道是否是这种情况,然后我将尝试使自己更加清楚。 认识BoxPong,这是我做的非常简单的游戏,以熟悉面向对象的游戏开发。拖动框以控制球并收集黄色的东西。 制作BoxPong可以帮助我提出一个基本问题:除其他事项外,我如何才能具有相互交互的对象?换句话说,有没有一种方法使对象不是分层的而是共存的?(我将在下面进一步详细介绍。) 我怀疑对象共存的问题是一个普遍的问题,因此我希望有一个既定的解决方法。我不想重新发明方形齿轮,因此我想寻找的理想答案是“这是一种通常用于解决您的问题的设计模式”。 尤其是在像BoxPong这样的简单游戏中,很明显,在同一级别上存在或应该存在少量对象。有一个盒子,有一个球,有一个收藏品。我可以用面向对象的语言表达的所有内容,尽管看起来似乎都是严格的HAS-A关系。这是通过成员变量完成的。我不能只是开始ball并让它做它的事情,我需要它永久地属于另一个对象。我已经设定,使游戏的主要对象有一个箱子,并依次盒子有一个球,并有一个比分反超。每个对象也都有一个update()方法,该方法计算位置,方向等,我走了类似的方法还有:我所说的主要游戏对象的更新方法,它调用了所有儿童的更新方法,它们依次调用所有的更新方法他们的孩子。这是我看到的制作面向对象游戏的唯一方法,但我认为这不是理想的方法。毕竟,我不会完全把球看作是属于盒子的东西,而是要处于同一水平并与之交互。我想可以通过将所有游戏对象都转换成主要游戏对象的成员变量来实现,但是我看不出有什么解决方法。我的意思是……撇开明显的混乱,如何让球和盒子互相认识,也就是互动? 还存在对象之间需要传递信息的问题。我有很多为SNES编写代码的经验,您几乎一直可以访问整个RAM。假设您要为Super Mario World定制敌人,并且希望它删除Mario的所有硬币,然后只存储零以解决$ 0DBF,这没问题。没有任何限制说敌人无法访问玩家的状态。我想我被这种自由宠坏了,因为对于C ++之类的东西,我经常发现自己在想如何使其他对象(甚至全局对象)可以访问值。 以BoxPong为例,如果我希望球从屏幕边缘弹起怎么办?width和height是的属性Game类,ball可以访问它们。我可以传递这些类型的值(通过构造函数或需要它们的方法),但是这只是对我的不好的做法。 我想我的主要问题是我需要对象彼此了解,但是我看到的唯一方法是严格的层次结构,这是丑陋且不切实际的。 我听说过C ++上的“朋友类”,并且知道它们是如何工作的,但是如果它们是最终解决方案,那么为什么我看不到friend每个C ++项目中都充斥着关键字呢?并不是每种OOP语言都存在这个概念吗?(我最近才了解到的函数指针也是如此。) 预先感谢您提供任何形式的答案-再次提醒您,如果有部分内容对您没有意义,请告诉我。

2
设计异常类
我正在编写一个小型库,在设计异常处理时遇到了一些麻烦。我必须说,我(仍然)对C ++语言的此功能感到困惑,并且我尝试尽可能多地阅读该主题,以了解如何正确使用异常类将要做什么。 我决定使用一种system_error方法,该方法从future_error该类的STL实现中获得启发。 我有一个包含错误代码的枚举: enum class my_errc : int { error_x = 100, error_z = 101, error_y = 102 }; 和一个异常类(由error_category结构类型和system_error模型所需的所有其他内容支持): // error category implementation class my_error_category_impl : public std::error_category { const char* name () const noexcept override { return "my_lib"; } std::string message (int ec) const override { std::string …

3
基于类型的不变量的函数编程答案是什么?
我知道不变性的概念存在于多种编程范例中。例如,循环不变式与OO,功能和过程编程有关。 但是,在OOP中发现的一种非常有用的类型是特定类型数据的不变性。这就是标题中所说的“基于类型的不变式”。例如,一个Fraction类型可能具有numerator和denominator,并且其gcd始终为1(即,分数为简化形式)是不变的。我只能通过某种类型的封装来保证这一点,而不是随意设置其数据。作为回报,我不必检查它是否减少了,因此我可以简化等式检查等算法。 另一方面,如果我只是声明一个Fraction类型而没有通过封装提供此保证,那么我就不能安全地在该类型上编写任何函数(假定分数减少了),因为将来有人可能会提出并添加一种方法掌握未减少的分数。 通常,缺少这种不变性可能导致: 需要在多个位置检查/确保前提条件的更复杂算法 DRY违规,因为这些重复的前提条件表示相同的基础知识(不变性应为真) 必须通过运行时故障而不是编译时保证来强制执行前提条件 所以我的问题是函数编程对这种不变性的回答是什么。是否有实现或多或少相同功能的惯用方式?还是功能编程的某些方面使收益的相关性降低?

5
用Java“编程到接口”总是有意义吗?
我已经看到了在这个问题上有关如何实例化从接口实现的类的讨论。就我而言,我正在用Java编写一个很小的程序,该程序使用的实例TreeMap,并且根据那里的每个人的看法,应将其实例化为: Map<X> map = new TreeMap<X>(); 在我的程序中,我正在调用函数map.pollFirstEntry(),该函数未在Map接口中声明(并且在Map接口中也存在其他几个声明)。我设法通过将其转换为一个TreeMap<X>我称之为以下方法的地方来做到这一点: someEntry = ((TreeMap<X>) map).pollFirstEntry(); 我了解上述针对大型程序的初始化准则的优点,但是对于很小的程序(该对象不会传递给其他方法),我认为这是不必要的。尽管如此,我还是在工作应用程序中编写此示例代码,但我不希望我的代码看起来很糟也不混乱。什么是最优雅的解决方案? 编辑:我想指出的是,我对广泛的良好编码实践而不是特定功能的应用更感兴趣TreeMap。正如一些答案已经指出的那样(我已经标记为第一个回答),应该使用更高的抽象级别,而又不会失去功能。

3
更好地编写带有COM限制的.NET库,还是将.NET库与Interop分开?
我碰到了一篇有趣的文章:我如何爱上 CodeProject上的COM互操作性,这让我开始思考... 作者认为,他们不希望在.NET库中有任何COM-ity,因为它剥夺了.NET库的美感。相反,他们宁愿编写一个单独的Interop库,以将其.NET库公开给COM。该Interop库将处理以下事实:COM不支持带参数,重载方法,泛型,继承,静态方法等的构造方法。 虽然我认为这很新颖,但它不只是使项目变得复杂吗? 现在,您需要对.NET库和一个Interop库进行单元测试。 现在,您需要花时间弄清楚如何解决漂亮的.NET库并将其公开给COM。 您需要有效地将班级人数增加一倍或两倍。 我当然可以理解您是否需要您的库来支持COM和非COM。但是,如果仅打算使用COM,这种设计是否会带来我看不到的好处?您仅获得C#语言的好处吗? 还是通过提供包装器使库的版本控制变得容易?是否通过不需要使用COM来使您的单元测试运行更快?

1
“通量”与纯函数式反应式编程之间是什么关系?
据我了解,Flux是一种技术,用于单向处理应用程序的数据流,将状态与程序的其余部分隔离在只读的独立“存储区”中,该存储区可以通过侦听来更改其自身的状态。由视图发出并由调度程序调度的“动作”。或者,简而言之-一种控制状态的方法。 如果是正确的话,它与功能反应式编程有何关系?由于FRP对状态有非常强的控制力,因此我想这是实际上解决相同问题的互斥技术。因此,如果使用FRP库(例如Elm),则Flux几乎没有用。它是否正确?

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.