传递一个方法来调用Obj作为Param

时间:2016-11-09 14:43:39

标签: javascript

我最初会问如何做,但似乎你可以传递方法名称,就像你可以传递属性名称一样。这是不好的做法吗?有什么理由不去做吗?

from .models import Theme, Post
from django.views.generic import ListView, DetailView


class ThemesOverview(ListView):
    """
    Overview of all themes
    """
    model = Theme
    template_name = 'content/theme_list.html'

    def get_queryset(self):
        queryset = Theme.objects.all()
        return queryset


class ThemePostsOverview(ListView):
    """
    Overview of all posts within a theme
    """
    model = Post
    template_name = 'content/theme_posts_list.html'

    def get_context_data(self, **kwargs):

        # Call the base implementation first to get a context
        context = super(ThemePostsOverview, self).get_context_data(**kwargs)

        slug = self.kwargs['theme']
        theme = Theme.objects.get(title=slug)
        context['theme'] = theme

        return context

    def get_queryset(self):
        queryset = Post.objects.all()
        return queryset

Plnkr

2 个答案:

答案 0 :(得分:1)

这不是一个坏习惯,实际上是常见的事情。

它主要用于代码分离或用于制作通用实现,例如,带有自定义回调的http请求。

答案 1 :(得分:1)

  

这是不好的做法吗?

没有

  

有什么理由不这样做?

这取决于你需要什么。通过"动词"从一组预设动作中选择的函数是非常有限的,传递一个函数本身("回调")允许调用者传递任意代码。

因此,如果您希望限制可能的操作,或者如果您的域要求限制了一组有用的操作,那么这种模式是适合的,无论如何它并不重要,但在其他情况下它感觉有点不灵活。

比较

DECLARE @data TABLE (ID int IDENTITY(1,1), X int, NoRequired int);

INSERT INTO @data(X, NoRequired)
    VALUES (1000,1), (1000,1), (800,2), (600,3), (1000,4), (1000,4), (800,5);

SELECT *
FROM @data;

function doSomeAction(actionName){
    var actionsObj = {
        writeSomething: function(x){ console.log(x); },
        …
    };
    actionsObj[actionName]('lol'); 
}

doSomeAction('writeSomething');
doSomeAction('someOtherOption'); // restricted by the callee
…

主要区别在于代码中可能采取的行动。 function doSomeAction(action){ action('lol'); } doSomeAction(function(x){ console.log(x); }); doSomeAction(anyOtherFunction); // chosen by the caller … 是否需要了解所有这些内容,每次都是一样的吗?