我应该在构造函数中引发异常吗

时间:2019-06-15 22:44:02

标签: typescript oop

如果我有一个三角课,就像这样:

export default class Triangle {

    sides: number[]

    constructor(...sides: number[]) {
        this.sides = sides
    }

    kind() {
        // returns type of triangle
    {
}

并且如果传递到构造函数中的两边没有创建一个真正的三角形,那么在创建类时(例如在构造函数中)或在调用函数时抛出错误会更好吗?

this answer,说在Java中还可以,而且我敢肯定它可以在TypeScript中使用。我只是想知道在OOP方面,特别是在TypeScript方面是否存在“最佳实践”。

2 个答案:

答案 0 :(得分:2)

在构造函数中抛出是完全可以接受的。通常,最佳实践是快速失败并尽早失败。例如,在您的情况下,最好抛出构造函数,以便可以将错误尽早暴露给负责发送不良数据的代码。如果您稍后在实际使用三角方法时抛出该异常,那么将被该异常破坏的代码就不会出错(它们可以采取任何措施来防止该异常)。这通常意味着您必须寻找对象的创建位置,才能解决该错误。

首先,构造函数的主要职责之一是确保只能在有效状态下创建对象。因此,如果参数将导致对象处于无效状态,则抛出异常不仅可以接受,而且这也恰恰说明了为什么构造函数首先存在的原因。

答案 1 :(得分:0)

没有正确的答案,但是您应始终使“不可能”状态表示为“不可能”,IE在这种情况下,三角形将始终具有3个边,因此仅使该数目之外的任何边都无法通过。

# views.py

def siren_search(request):

    context = {}

    if request.method == 'GET':

        term = request.GET.get('query')
        if term:
            try:
                jobsite = JobSite.objects.get(name__iexact = term)
                cameras = jobsite.camerasystem_set.all()
                context = {
                    'cameras': cameras,
                    'numberOfCameras': len(cameras)
                }

            except ObjectDoesNotExist:
                pass

    ## Add functionality to handle button click and make the following request
    pulseSiren = requests.get(f'{camera.name}.example.com:port/file.xml?relay2State=2', auth=('user', 'pass'))

    return render(request, 'siren_search.html', context)

这样做的好处是,每当传递无效数量的修饰符时,程序都会在编译时(安全)而不是运行时(不安全)失败。