首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >排名前十的职业名单,按不同属性排列

排名前十的职业名单,按不同属性排列
EN

Code Review用户
提问于 2015-05-20 14:58:22
回答 3查看 79关注 0票数 0

在下面的代码中,所有函数对都非常相似:

  1. 集函数
    • rankListId不同
    • rankListName不同
    • Mongoengine是不同的

  2. 获取函数
    • rankListId是不同的

我怎样才能把这些函数变成一个函数呢?

代码语言:javascript
运行
复制
def set_male_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_male_rank_list"
    rankList.rankListName = u"十大男生比例最高职业"
    rankList.itemList     = []

    charts = ZhinengMaleCharts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_male_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_male_rank_list")

def set_female_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_female_rank_list"
    rankList.rankListName = u"十大女生比例最高职业"
    rankList.itemList     = []

    charts = ZhinengFemaleCharts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_female_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_female_rank_list")

def set_salary0_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_salary0_rank_list"
    rankList.rankListName = u"十大毕业生高薪职业"
    rankList.itemList     = []

    charts = ZhinengSalary0Charts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_salary0_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_salary0_rank_list")

def set_salary5_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_salary5_rank_list"
    rankList.rankListName = u"十大五年后高薪职业"
    rankList.itemList     = []

    charts = ZhinengSalary5Charts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_salary5_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_salary5_rank_list")

def set_salary5_inc_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_salary5_inc_rank_list"
    rankList.rankListName = u"十大五年涨幅最大职业"
    rankList.itemList     = []

    charts = ZhinengSalary5IncCharts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_salary5_inc_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_salary5_inc_rank_list")

def set_salary5_inc_ratio_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_salary5_inc_ratio_rank_list"
    rankList.rankListName = u"十大五年涨幅比例最大职业"
    rankList.itemList     = []

    charts = ZhinengSalary5IncRatioCharts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_salary5_inc_ratio_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_salary5_inc_ratio_rank_list")

def set_stability_asc_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_stability_asc_rank_list"
    rankList.rankListName = u"十大最不稳定职业"
    rankList.itemList     = []

    charts = ZhinengYearsDesc.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_stability_asc_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_stability_asc_rank_list")

def set_stability_desc_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_stability_desc_rank_list"
    rankList.rankListName = u"十大最稳定职业"
    rankList.itemList     = []

    charts = ZhinengYearsAsc.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_stability_desc_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_stability_desc_rank_list")

def set_major_ratio_asc_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_major_ratio_asc_rank_list"
    rankList.rankListName = u"十大就页面最窄职业"
    rankList.itemList     = []

    charts = ZhinengMajorsAsc.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_major_ratio_asc_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_major_ratio_asc_rank_list")

def set_major_ratio_desc_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_major_ratio_desc_rank_list"
    rankList.rankListName = u"十大就页面最广职业"
    rankList.itemList     = []

    charts = ZhinengMajorsDesc.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_major_ratio_desc_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_major_ratio_desc_rank_list")

def set_male_priority_rank_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_male_priority_rank_list"
    rankList.rankListName = u"十大男性有优势专业"
    rankList.itemList     = []

    charts = ZhinengMaleMinusFemaleCharts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_male_priority_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_male_priority_rank_list")

def set_female_priority_list(self):
    rankList              = RankList()
    rankList.rankListId   = "zhineng_male_priority_rank_list"
    rankList.rankListName = u"十大女性有优势专业"
    rankList.itemList     = []

    charts = ZhinengFemaleMinusMaleCharts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

def get_female_priority_rank_list(self):
    return self.rankListClient.getRankList("", "zhineng_female_priority_rank_list")
EN

回答 3

Code Review用户

回答已采纳

发布于 2015-05-20 22:39:13

我认为这里有更多的问题,而不仅仅是你所粘贴的这些方法。我将首先在这里讨论总体想法,然后讨论您可以在不更改接口的情况下进行更改。

数据驱动设计

这里有几种方法,每种方法在参数化方面都不同,而不是它们的实际行为。这是一个巨大的危险信号,应该立即处理。

现在你怎么做是另一回事了。下面,我将将其重构为一种更实用的方法,并假设由于外部代码不受您的控制,接口无法更改。

然而,我也想在这里提出另一个想法,它可能,也可能不适用于你。

由于(不可见的)容器类有太多的方法,看起来不太好,名称在各处重复,最终结果是可怕的名称。不如使用两个方法来公开包装器对象,而不是有几个get/set_*_rank_list方法。因此,例如。

代码语言:javascript
运行
复制
class Foo(object):
    def __init__(self, ...):
        ...
        self.male_rank_list = RankListWrapper(
            "zhineng_male_rank_list",
            u"十大男生比例最高职业",
            ZhinengMaleCharts,
            self.rank_list_client
        )
        ...

然后,访问模式将类似于:

代码语言:javascript
运行
复制
foo.male_rank_list.fetch() # instead of foo.get_male_rank_list()
foo.male_rank_list.update() # instead of foo.set_male_rank_list()

不是最好的方法名称,但仍然比get/set更好。

您在这里得到的是更多的灵活性和大量的打字减少。当然,这也可以通过更多的元编程来实现,但对我可以从您的代码中收集到的内容,以及您的需求来说,这已经足够了。

文体变化

  • 跟着PEP8走。这意味着实例变量应该有小写名称,下划线作为分隔符。
  • 为什么RankLists不使用构造函数初始化?如果您不能更改它,那么您可以创建一个像create_rank_list这样的包装器函数来解决这个问题。
  • for c in charts循环是冗长的,同样的事情可以更容易地通过列表理解来实现: rankList.itemList = RankListItem(c.zhineng )_id,c.zhineng_图中c的id)这里奇怪的是RankListItem接受了两次ID参数。如果可能的话,将其更改为默认为第一个参数。否则,您可以创建像create_rank_list_item(id)这样的辅助函数。

此时,您可以选择函数式路线,也可以采用更多数据驱动的路线--我选择后者是为了更密切地模仿上面描述的想法。通过将函数的所有参数放入单独的定义(不管是类、字典、纯文本或命名元组),代码变得更短、更可重用。

最终结果如下所示:

代码语言:javascript
运行
复制
def create_rank_list(id, name, item_list):
    result = RankList()
    result.rankListId = id
    result.rankListName = name
    result.itemList = item_list
    return result

def create_rank_list_item(id):
    return RankListItem(id, id)

class RankListDefinition(object):
    def __init__(self, id, name, charts):
        self.id = id
        self.name = name
        self.charts = charts

MALE_RANK_LIST = RankListDefinition(
    "zhineng_male_rank_list",
    u"十大男生比例最高职业",
    ZhinengMaleCharts
)
...

class Foo(object):
    ...
    def set_rank_list(self, definition):
        charts = definition.charts.objects.all()[:10]

        rank_list = create_rank_list(
            definition.id,
            definition.name,
            [create_rank_list_item(c.zhineng_id) for c in charts]
        )

        self.rankListClient.setRankList("", rank_list)

        return rank_list

    def get_rank_list(self, definition):
        return self.rankListClient.getRankList("", definition.id)

    def set_male_rank_list(self):
        return self.set_rank_list(MALE_RANK_LIST)

    def get_male_rank_list(self):
        return self.get_rank_list(MALE_RANK_LIST)
    ...

如您所见,所有内容都被分解到代码(get/set_rank_list)和数据(MALE_RANK_LIST,.)中,因此,通过再添加一个定义(以及这个变体中的两个方法),就可以添加一个新的列表了。

由于包装方法非常无用,我仍然建议改用上述间接方法。

另外,如果所有这些方法都被一个接一个地调用,我也会删除所有这些方法,以支持在一个“排名列表定义”列表上的循环(只是说)。

票数 1
EN

Code Review用户

发布于 2015-05-20 15:33:17

我在Python上有点生疏,所以我的语法可能有点错误,但是这样的东西应该能用.

方法的目的是避免冗余。上述两个函数的逻辑完全相同,只有几个小例外,那么为什么不为它们使用ifs和字符串操作呢?

代码语言:javascript
运行
复制
def set_rank_list(self, gender):
    rankList              = RankList()
    rankList.itemList     = []
    rankList.rankListId   = "zhineng_%s_rank_list" % gender
    rankList.rankListName = u"十大男生比例最高职业"
    if gender is 'male':
        charts = ZhinengMaleCharts.objects.all()[:10]
    else:
        charts = ZhinengFemaleCharts.objects.all()[:10]

    for c in charts:
        rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))

    self.rankListClient.setRankList("", rankList)

    return rankList

# and you can add these for convenience
def set_female_rank_list(self):
    return self.set_rank_list('female')

def set_male_rank_list(self):
    return self.set_rank_list('male')
票数 0
EN

Code Review用户

发布于 2015-05-20 20:19:16

只是扩展了陈氏解

代码语言:javascript
运行
复制
rankList = RankList()
rankList.rankListId ="zhineng_male_rank_list"
rankList.rankListName = u"十大男生比例最高职业"
rankList.itemList = []

# makes it easier sex is later decided to be presented as 'M'/'F'
@classmethod
def is_male(gender)
   return {
      'male': True,
      'female': False,
    }.get(x, False)  # can be replaced by None for a wrong gender


self.chartSize = 10

def set_rank_list(self,gender):
    charts = ZhinengMaleCharts if is_male(gender) else ZhinengFemaleCharts
    charts = charts[0:self.chartSize]
    rankList.itemList = [RankListItem(c.zhineng_id, c.zhineng_id) for c in charts] 
    self.rankListClient.setRankList("", rankList)
    return rankList

如对下列更改有任何意见,敬请见谅。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/91294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档