我什么时候应该写一个类而不是一组函数?

2024-04-25 06:36:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我懂一些编程,我正在帮助我父亲写我的第一个真正的应用程序到他的商店。由于我是唯一的程序员,我必须决定程序的结构,我真的害怕用一些“设计选择”来打击自己。你知道吗

我面临的一个这样的问题是什么时候只对一堆方法使用类。让我给你举个真实的例子。我(将)有一组函数连接到mysql数据库并以不同的方式解析信息。我知道类是如何工作的,我读过关于它们的文章,并实现了一堆示例类。但是我不知道什么时候应该用它们而不是一堆函数。如果一些更有经验的程序员能分享一下这背后的思维过程,我将不胜感激。关于什么时候写一个类,什么时候不写,你有什么经验法则吗?你知道吗

作为一个附带问题,有多少评论是足够的?因为我从来没有写过任何“真正的”程序,所以我通常从不评论我的代码。现在我忍不住觉得我对它的评论太多了,因为我担心有一天我会迷失在自己的代码中。你知道吗

事先非常感谢。你知道吗

如果有人好奇的话,下面是我现在拥有的代码,尽管它与这个问题不是特别相关。你知道吗

# -*- coding: utf-8 -*-

import MySQLdb as mdb
import datetime as dt

try:
    con = mdb.connect('localhost', 'root', '', 'database')
    cur = con.cursor()

except mdb.Error:
    print "Erro na conexao com o banco de dados!"
    exit()

def getAverageDate(date, question):
    """ Returns the average of ratings for a question in a given date
    "   Returns a Decimal object if the date exists in the
    "   database, otherwise, returns None
    """
    query = ("SELECT AVG(idvalue) FROM value, submissions "
            "WHERE value.answer = submissions.answer "
            "AND submissions.question_id = %s "
            "AND submissions.answer_date = %s")
    try:
        cur.execute(query, (question, date))
        result = cur.fetchone()[0]
        return result
    except mdb.Error:
        return mdb.Error;

def dateRange(initialDate, finalDate):
    """ Generates all dates between a range of dates, finalDate non inclusive"""
    for n in range(int ((finalDate - initialDate).days)):
        yield initialDate + dt.timedelta(n)

def getAverageBetweenDates(initialDate, finalDate, question):
    """ Returns a list containing two tuples with the average rating for
    "   a given date, and that date. If there are no ratings for a given
    "   date, it is not included in the list
    """
    dates = []
    values = []
    for date in dateRange(initialDate, finalDate):
        val = getAverageDate(date, question)
        if val is not None:
            dates.append(date.strftime("%x"))
            values.append(getAverageDate(date, question))
    return dates, values

Tags: the代码infordatedef评论error
3条回答

好的,显然你现在只有一个模块,里面有几个连接不紧密的方法。你知道吗

很明显,在加载模块的过程中,您正在全局上下文中创建一个变量。对我来说,这是一个明显的迹象,表明您应该改用类,并将代码放在__init__()方法中:

# -*- coding: utf-8 -*-

import MySQLdb as mdb
import datetime as dt

class connector(object):
    def __init__(self):
        try:
            con = mdb.connect('localhost', 'root', '', 'database')
            self.cur = con.cursor()

        except mdb.Error:
            print "Erro na conexao com o banco de dados!"
            exit()

    # etc...

最重要的区别是:mdb.connect()如果执行import connector操作,则不会发生etc,而是在第一次初始化类时发生。你知道吗

计划为所有项目使用类是个好主意。从长远来看,它将创建一个更坚实的结构体,您将对代码有更好的总体把握。你必须考虑你的计划的每个主要方面,决定你希望他们如何相互作用,每个人将有什么主要的组成部分,预测未来的事件,并计划,总是计划,扩展。例如,所有用户函数(或方法)都将放在一个用户类中。你知道吗

class user {
private:
     string name;
     int    age;

public:
     void setAge(int age);
     int getAge;
     void setName(string name);
     string getName();
}
<>这是C++,但是概念是真实的…


对于显示的代码,可以创建一个db(数据库)类。您可以将返回的任何信息(没有传递给另一个类对象)存储在它的类变量中,并且您的所有函数都有一个很好的关联容器可供调用。

1)阅读SOLID原则。首先,第一个原则就足够了——单一责任原则。通常你不会留下松散的,悬空的方法。经验法则是构建类,这些类有一个精确定义的职责。您可以定义一些实用函数(如果您需要它们,而Python还没有提供它们),但是您通常将它们组合在一个单独的模块中。你知道吗

2)评论多少就够了?这是一个简单的问题-没有任何评论就足够了。代码应该通过良好命名的类和函数来记录自己。很酷的报价:

Code should read like well-written prose

更难的问题是-评论多少就太多了?当注释可以被更好的函数/类名和更好的代码分区所取代时,注释就太多了。你知道吗

注释作为解释代码的一种手段,实际上只是一种历史遗留机制,例如变量和函数需要简短的名称。现在你不必用“d”作为变量名,你可以称之为“invoiceDueDate”并方便地使用它。使用注释来记录公共图书馆的API是使用它们的唯一理由。你知道吗

相关问题 更多 >