软件工程

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

28
优雅地降级JavaScript有多重要?
Web开发人员是否应该继续努力用JavaScript逐步增强我们的Web应用程序,以确保功能正常降级,从而确保可访问性?还是我们应该花时间专注于新功能或其他开发领域? 该问题的潜台词是:有多少客户/客户/用户在禁用JavaScript的情况下使用我们的网站或应用程序?您是否有任何项目要求特别要求JavaScript功能(几乎是我的全部要求),并且这些要求还要求正常降级吗? 为了提出这个问题,我在未启用JavaScript的情况下调出了developers.stackexchange.com,并收到以下消息:“程序员-Stack Exchange在启用JavaScript的情况下效果最佳”。尽管该站点通常可以正常工作,但登录非常困难。(我无法投票解决任何问题。) 我认为这是令人满意的发展方法。想象一下,使网站的所有功能都可以与普通的旧HTML和服务器端逻辑一起使用时所付出的努力。另一方面,我想知道有多少用户被这种方法疏远了。 我们所有人(至少是我们当中优秀的开发人员)都经过培训,可以使用渐进式增强功能并确保我们的Web应用程序的动态功能正常降级。是这种渐进式增强只是随风而上,还是我们的某些客户实际上在未启用JavaScript的情况下真正利用了某些Web服务?

30
您想在PHP中拥有哪些功能?[关闭]
既然现在是假期,每个人都在许愿,我想知道-您希望PHP将添加哪些语言功能?我对这种语言的一些实用建议/希望很感兴趣。实际上,我的意思是: 可以实际完成的操作(不是:“我希望PHP猜出我的代码的含义并为我修复错误”或“我希望任何代码都可以在5毫秒内执行”) 不需要将PHP更改为另一种语言的东西(不是:“我希望他们放弃$符号并使用空格而不是花括号”或“我希望PHP被编译,静态键入并以#命名”) 不需要破坏所有现有代码的东西(不是:“让我们重命名500个函数并更改它们的参数顺序”) 东西不改变语言或它的一些有趣的方面(不是:“我希望有扩展XYZ协议,支持”或“我想了bug#12345终于固定”) 不仅仅是喧嚣的东西(不是:“我希望PHP不会糟透了”) 有人有美好的祝愿吗? 国防部编辑:Stanislav Malyshev是一名核心PHP开发人员。

5
为什么%s在连接方面比+好?
我知道我们应该使用%s连接字符串而不是+Python。 我可以执行以下任何一项操作: hello = "hello" world = "world" print hello + " " + world print "%s %s" % (hello, world) print "{} {}".format(hello, world) print ' '.join([hello, world]) 但是我为什么要使用除之外的其他东西+呢?用简单的编写连接更快+。然后,如果你看一下格式化字符串,您指定的类型如%s和%d和这样。据我了解,最好对类型进行明确说明。 但是后来我读到,+即使输入起来更容易,也应避免使用for串联。是否有明确的理由应该以其他方式之一将字符串连接起来?
88 python  strings 

3
中断默认情况下的开关
我break常常不愿在最后一个案例之后加上或不包括在内default。 switch (type) { case 'product': // Do behavior break; default: // Do default behavior break; // Is it considered to be needed? } break我的唯一目的是阻止代码在其余的switch-case中运行。 那么,break由于一致性而导致的最后一个是否更合乎逻辑,或者由于不break进行任何功能性使用而跳过了它是否更合逻辑?我认为两者在逻辑上都是不同的。 这可以在某种程度上与以结尾的.php文件进行比较?>。我?>之所以从不结束,主要是因为有输出空白的风险,但有人可能会认为以文件结尾是合乎逻辑的事情。

3
为什么硬件加速的矢量图形没有被删除?
我正在开发一个涉及以60fps实时处理矢量路径的应用程序,而关于该主题的信息很少,我感到非常惊讶。最初,我尝试使用CoreGraphics来实现我的想法,但是对于我的目的而言,它的表现并不理想。然后,我发现有一个用于硬件加速矢量图形的Khronos标准称为OpenVG,并且值得庆幸的是,一个善良的人写了一个名为MonkVG的OpenGL ES半实现。 但是,尽管事实上OpenVG是一个非常实用的API,但Khronos似乎还是放弃了它。根据Wikipedia的说法,自2011年以来,工作组“决定……不召开任何常规会议以进一步实现标准化”。据我所知,该文档仅包含一个参考卡。而且,互联网上几乎没有OpenVG的任何示例。我可以在眨眼之间找到数百个OpenGL教程,但是OpenVG似乎明显缺失。 您可能会认为,在当今分辨率迅速提高的世界中,硬件加速矢量将更为重要,而且似乎许多公司正在实现自己的方式。例如,Qt和Flash具有用于硬件加速矢量的方案,并且许多Adobe的工具都可以选择硬件加速。但是,当标准已经存在时,车轮似乎正在被彻底改造! 关于OpenVG,我是否缺少某些东西,使其不适合实际使用?还是仅仅是因为标准没有及时赶上而现在注定要变得晦涩难懂?您认为将来是否存在用于硬件加速矢量图形的标准化API的空间,还是使用基于栅格的传统技术会更容易?还是矢量在进入之前就只是在走出去?

9
检查优先与异常处理?
我正在阅读“ Head First Python”一书(这是我今年要学习的语言),然后进入一节,他们讨论了两种代码技术: 检查First与Exception处理。 这是Python代码的示例: # Checking First for eachLine in open("../../data/sketch.txt"): if eachLine.find(":") != -1: (role, lineSpoken) = eachLine.split(":",1) print("role=%(role)s lineSpoken=%(lineSpoken)s" % locals()) # Exception handling for eachLine in open("../../data/sketch.txt"): try: (role, lineSpoken) = eachLine.split(":",1) print("role=%(role)s lineSpoken=%(lineSpoken)s" % locals()) except: pass 第一个示例直接处理.split函数中的问题。第二个只是让异常处理程序处理它(并忽略该问题)。 他们在书中主张使用异常处理而不是先检查。该论点是异常代码将捕获所有错误,其中首先进行检查将仅捕获您所考虑的事情(并且您错过了极端情况)。我被教导首先要检查,所以我的本能是这样做,但是他们的想法很有趣。我从未想过使用异常处理来处理案例。 通常认为这两种方法中的哪一种更好?

8
什么是“软编码”?
在Alex Papadimoulis的这篇文章中,您可以看到以下片段: private void attachSupplementalDocuments() { if (stateCode == "AZ" || stateCode == "TX") { //SR008-04X/I are always required in these states attachDocument("SR008-04X"); attachDocument("SR008-04XI"); } if (ledgerAmnt >= 500000) { //Ledger of 500K or more requires AUTHLDG-1A attachDocument("AUTHLDG-1A"); } if (coInsuredCount >= 5 && orgStatusCode != "CORP") { //Non-CORP orgs …
87 design 

10
单元测试应用程序逻辑和不信任的语言构造之间的界线在哪里?
考虑这样的函数: function savePeople(dataStore, people) { people.forEach(person => dataStore.savePerson(person)); } 可以这样使用: myDataStore = new Store('some connection string', 'password'); myPeople = ['Joe', 'Maggie', 'John']; savePeople(myDataStore, myPeople); 让我们假设它Store具有自己的单元测试,或由供应商提供。无论如何,我们都相信Store。让我们进一步假设错误处理(例如,数据库断开错误)不是的责任savePeople。确实,让我们假设商店本身是一个神奇的数据库,它不可能以任何方式出错。 鉴于这些假设,问题是: 应该savePeople()进行单元测试,还是将这些测试等同于测试内置forEach语言结构? 当然,我们可以传递一个模拟dataStore并断言dataStore.savePerson()每个人都会被调用一次。您当然可以说这样的测试可提供针对实现更改的安全性的论据:例如,如果我们决定forEach用传统的for循环或某种其他迭代方法代替。因此,测试并非完全无关紧要。但是它似乎非常接近... 这是另一个可能更富有成效的例子。考虑一个仅协调其他对象或功能的功能。例如: function bakeCookies(dough, pan, oven) { panWithRawCookies = pan.add(dough); oven.addPan(panWithRawCookies); oven.bakeCookies(); oven.removePan(); } 假设您认为这样的功能应该如何进行单元测试?这是我很难想象任何种类的单元测试的不只是嘲笑dough,pan和oven,然后断言方法被调用它们。但是这样的测试无非是复制了该函数的确切实现。 无法以有意义的黑盒方式测试功能是否表明功能本身存在设计缺陷?如果是这样,如何改进? 为了更清楚地说明激发bakeCookies示例的问题,我将添加一个更现实的场景,该场景是我尝试向其添加代码并重构遗留代码时遇到的一种情况。 当用户创建新帐户时,需要做很多事情:1)需要在数据库中创建新用户记录2)需要发送欢迎电子邮件3)需要记录用户的IP地址以防欺诈目的。 因此,我们想创建一个将所有“新用户”步骤联系在一起的方法: function createNewUser(validatedUserData, emailService, dataStore) …

13
在源代码中编写SQL是否被视为反模式?
将SQL硬编码到这样的应用程序中是否被认为是一种反模式: public List<int> getPersonIDs() { List<int> listPersonIDs = new List<int>(); using (SqlConnection connection = new SqlConnection( ConfigurationManager.ConnectionStrings["Connection"].ConnectionString)) using (SqlCommand command = new SqlCommand()) { command.CommandText = "select id from Person"; command.Connection = connection; connection.Open(); SqlDataReader datareader = command.ExecuteReader(); while (datareader.Read()) { listPersonIDs.Add(Convert.ToInt32(datareader["ID"])); } } return listPersonIDs; } 我通常会有一个存储库层等,但是为了简单起见,我在上面的代码中将其排除在外。 我最近收到了一位同事的一些反馈,该同事抱怨SQL是用源代码编写的。我没有机会问为什么,他现在已经离开了两个星期(也许还有更多)。我认为他的意思是: 使用LINQ …
87 c#  sql 

2
MIT,BSD和双重许可
我的理解是: MIT许可项目可以在BSD许可项目中使用/分发。 BSD许可的项目可以在MIT许可的项目中使用/分发。 MIT和BSD 2子句许可证本质上是相同的。 BSD 3子句= BSD 2子句+ “无认可”子句 颁发双重许可证允许用户从这些许可证中进行选择,而不必两者都绑定。 如果以上所有方法都正确,那么使用MIT / BSD 双重许可证有什么意义?即使BSD引用了3子句版本,用户也不能合法选择仅遵守MIT许可证吗? 看来,如果您确实希望应用“不认可”子句,则必须仅将其许可为BSD(不是双重许可)。如果您不关心“不认可”子句,那么仅MIT就足够了,而MIT / BSD就是多余的。 同样,由于MIT和BSD许可证都是“ GPL兼容 ”的,并且可以在GPL许可的项目中重新分配,因此MIT / GPL双重许可似乎也很多余。



29
我的公司可以将我在几个小时内注销的应用程序的知识产权授予其他初创公司吗?[关闭]
我是一家卫生公司(无薪)的实习生,我们称之为A公司,我注意到他们使用很多纸质表格来完成可以在计算机上完成的事情。Excel文件中不应包含的内容。因此,我想改进自己的编程,并认为这是最好的机会。 我开发了一些应用程序供他们使用。所有这些应用程序都在公司时间之外。我提出了一份申请书,他们很喜欢,其中一位董事有一个兄弟,他经营一家健康公司。他希望我放弃我的源代码,以便他兄弟的公司可以进一步开发它,甚至可以出售它(我无法接受)。 我无意交出我的代码,因为我花了很多时间在外面,但我也不想与公司中的任何人建立桥梁。我不能去找导演,告诉他“我不这么认为”。 我可以向兄弟演示它是如何工作的,但是该行正在放弃我的代码。如果他们想构建类似的东西,那么他们可以继续前进,我对此没有问题。 解决此问题的正确方法是什么,他们是否有权对我这样做? 编辑:没有合同我什么都没签

11
为什么main()应该很短?
我已经进行了9年以上的编程工作,并且根据我的第一位编程老师的建议,我始终将我的main()函数保持得非常简短。 起初我不知道为什么。我只是听从而不理解,这让我的教授们非常高兴。 在获得经验之后,我意识到,如果我正确地设计了代码,则具有短main()函数的情况就会发生。编写模块化代码并遵循单一职责原则,使我的代码可以“分批”设计,并且main()无非是推动程序运行的催化剂。 快到几周前,我正在查看Python的源代码,然后找到了该main()函数: /* Minimal main program -- everything is loaded from the library */ ... int main(int argc, char **argv) { ... return Py_Main(argc, argv); } 是的python。短main()函数==良好的代码。 编程老师是对的。 想深入了解一下,我看了一下Py_Main。整个定义如下: /* Main program */ int Py_Main(int argc, char **argv) { int c; int sts; char *command = NULL; char …


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.