我最近在教自己的Python,并发现LBYL / EAFP成语在错误检查之前执行代码。 在Python中,EAFP似乎是被接受的风格,而且它似乎与这个语言一起工作得很好。 LBYL(在你之前): def safe_divide_1(x, y): if y == 0: print "Divide-by-0 attempt detected" return None else: return x/y EAFP( 它比P ermission更安全 ): def safe_divide_2(x, y): try: return x/y except ZeroDivisionError: print "Divide-by-0 attempt detected" return None 我的问题是:我从来没有听说过使用EAFP作为主要的数据validation结构,来自Java和C ++的背景。 EAFP是在Java中使用明智的东西吗? 还是有太多的例外开销? 我知道只有在实际抛出exception时才会有开销,所以我不确定为什么不使用EAFP的简单方法。 这只是偏好吗?
我曾经见过一些这样的成语(包括SO ): // Deliberately empty subscriber public event EventHandler AskQuestion = delegate {}; 好处很明显 – 它避免了在提高事件之前检查空值的需要。 不过,我很想知道是否有任何缺点。 例如,它是否被广泛使用,是否透明,不会造成维修头痛? 是否有空的事件订户呼叫有明显的性能影响?
我们是否可以增加这种面向密钥的访问保护模式的可重用性: class SomeKey { friend class Foo; // more friends… ? SomeKey() {} // possibly non-copyable too }; class Bar { public: void protectedMethod(SomeKey); // only friends of SomeKey have access }; 为避免持续的误解,这种模式与律师 – 客户惯用法不同: 它可以比律师 – 客户更简洁(因为它不涉及通过第三类代理) 它可以允许访问权限的授权 …但它也更原始的类(每个方法一个虚拟参数) (在这个问题上进行了一个侧面讨论,因此我打开了这个问题。)
C ++中有这样一件事情,使我长时间感到不舒服,因为我真的不知道该怎么做,尽pipe听起来很简单: 如何在C ++中正确实现工厂方法? 目标:使客户可以使用工厂方法而不是对象的构造函数实例化一些对象,而不会造成不可接受的后果和性能问题。 “工厂方法模式”是指对象内部的静态工厂方法或其他类中定义的方法或全局函数。 一般来说,“把X类实例化的正常方式redirect到构造函数以外的任何地方”的概念。 让我浏览一下我想到的一些可能的答案。 0)不要制造工厂,build造者。 这听起来不错(通常是最好的解决scheme),但不是一般的补救措施。 首先,有些情况下,对象build设是一个任务复杂到足以certificate其提取到另一个类。 但是即使把这个事实放在一边,即使对于使用构造函数的简单对象也是不行的。 我所知道的最简单的例子是一个2Dvector类。 这么简单,但棘手。 我希望能够从笛卡儿坐标和极坐标两方面构造它。 显然,我不能这样做: struct Vec2 { Vec2(float x, float y); Vec2(float angle, float magnitude); // not a valid overload! // … }; 那么我自然的思考方式是: struct Vec2 { static Vec2 fromLinear(float x, float y); static Vec2 fromPolar(float angle, float magnitude); // … }; 其中,而不是构造函数,导致我使用静态工厂方法…这基本上意味着我正在实施工厂模式,以某种方式(“class级成为自己的工厂”)。 […]
if __name__ == "__main__":做什么? # Threading example import time, thread def myfunction(string, sleeptime, lock, *args): while 1: lock.acquire() time.sleep(sleeptime) lock.release() time.sleep(sleeptime) if __name__ == "__main__": lock = thread.allocate_lock() thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock)) thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
我最近开始维护别人的JavaScript代码。 我正在修复错误,增加function,并试图整理代码并使其更加一致。 以前的开发人员使用两种声明函数的方法,如果有没有原因,我不能解决。 两种方式是: var functionOne = function() { // Some code }; function functionTwo() { // Some code } 使用这两种不同方法的原因是什么?每种方法的优缺点是什么? 有一种方法可以用另一种方法完成吗?