我正在学习Objective-C,并有一个C / C ++的背景。 在面向对象的C ++中,在定义(实现)它之前,你总是需要声明你的方法,即使它是在父类中声明的。 在程序风格的C,IIRC中,只要定义一个函数,只要从文件中稍后出现的同一个编译单元(即同一个文件)中的其他东西中调用,就可以避开(好吧,提供你不用“extern”在其他地方声明)。 现在,在Objective-C中,看起来只需要在头文件中声明select器,如果它们将被外部使用,并且可以在.m文件中构造select器就好,然后调用它们.m文件。 此外,似乎委托方法或inheritance方法从不(重新)定义。 我在正确的轨道上? 什么时候需要在Objective-C中定义一个select器?
我经常听说jQuery做出了一些糟糕的API决策。 尽pipejQuery并不是我最喜欢的库,但它是我经常使用的库,我很难指出APIdevise中的具体错误,以及如何改进。 jQuery API的哪些部分可以做得更好, 怎样才能实现不同, 为什么不同的实现会更好? 这个问题扩展到API的低级别的个别细节和API的高级细节 。 我们只是在讨论API中的缺陷,而不是在库的高层devise/目的中的缺陷,jQuery仍然是一个以select器引擎为中心的DOM操作库。 由于stream行库中API冻结的必要性,jQuery陷入了当前状态,开发人员做得很好。 从最近的.attr和.prop变化可以看出,开发人员没有灵活性来改变他们的任何devise决定(这是一个耻辱!)。 我能想到的一个具体例子就是 $.each(function(key, val) { }) VS $.grep(function(val, key) { }) 这足以让我感到困惑,所以我必须仔细检查参数是多频繁的。 请不要将jQuery 库与dojo和YUI等完整的框架进行比较,并抱怨缺lessfunction。
似乎今天的网站有两类API。 API允许网站的function扩展,如Facebook,Myspace等。这些API似乎非常多样化。 允许与Twitter,Flickr等现有网站function交互的API。这些都声称是基于REST的,但实际上只是“HTTP上的数据”。 如果您正在创build一个允许function扩展和外部交互的网站,那么您将使用哪些现有API作为参考模型?
以下代码引发NullPointerException : int num = Integer.getInteger("123"); 我的编译器调用getInteger为null,因为它是静态的吗? 这没有任何意义! 发生了什么?
与C#的IEnumerable ,在执行stream水线可以执行多次的情况下,Java中的stream只能被“迭代”一次。 任何对terminal操作的调用都会closuresstream,导致stream不可用。 这个“function”带走了很多权力。 我想这是不是技术性的原因。 这个奇怪的限制背后的devise考虑是什么? 编辑:为了演示我在说什么,请考虑以下在C#中的快速sorting实现: IEnumerable<int> QuickSort(IEnumerable<int> ints) { if (!ints.Any()) { return Enumerable.Empty<int>(); } int pivot = ints.First(); IEnumerable<int> lt = ints.Where(i => i < pivot); IEnumerable<int> gt = ints.Where(i => i > pivot); return QuickSort(lt).Concat(new int[] { pivot }).Concat(QuickSort(gt)); } 可以肯定的是,我并不是主张这是一个快速sorting的好实现! 然而,这是lambdaexpression式与stream操作相结合的performance力的一个很好的例子。 而且不能用Java来完成! 我什至不能问一个stream是否是空的,而不会使其无法使用。
我正在编写一个JavaScript函数,它发出一个HTTP请求并返回结果的承诺(但这个问题同样适用于基于callback的实现)。 如果我立即知道提供给函数的参数是无效的,那么函数应该同步throw ,还是应该返回一个被拒绝的promise(或者,如果你愿意的话,用Error实例调用callback函数)? asynchronous函数应该总是以asynchronous的方式运行,特别是对于错误条件,这有多重要? 如果知道程序不是处于asynchronous操作的适当状态,可以throw吗? 例如: function getUserById(userId, cb) { if (userId !== parseInt(userId)) { throw new Error('userId is not valid') } // make async call } // OR… function getUserById(userId, cb) { if (userId !== parseInt(userId)) { return cb(new Error('userId is not valid')) } // make async call }