0

我知道一些编程,我正在帮助我父亲,将我的第一个真正的应用程序写到他的商店。因为我是唯一的程序员,所以我必须决定程序的结构,我真的很害怕用一些“设计选择”来打自己的脚。

我面临的一个这样的问题是何时对一堆方法使用类。让我给你一个真实的例子。我(将)有一堆连接到 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
4

3 回答 3

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但当你第一次初始化类时。

于 2013-08-24T20:56:10.453 回答
2

1) 阅读SOLID原则。对于初学者来说,第一个原则就足够了——单一职责原则。通常你不会留下松散的、悬挂的方法。经验法则是构建具有一个精确定义的职责的类。你可以定义一些实用函数(如果你需要它们而 Python 还没有提供它们),但是你通常将它们组合在一个单独的模块中。

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

代码应该读起来像写得很好的散文

更难的问题是 - 多少评论太多了?太多的注释是当它们可以被更好的函数/类名称和更好的代码分区替换时。

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

于 2013-08-24T20:59:03.073 回答
1

计划为所有项目使用类是个好主意。从长远来看,它将创建一个更可靠的结构,并且您将对代码有更好的整体把握。您必须考虑程序的每个主要方面,决定您希望它们如何相互交互,每个主要组件将具有哪些主要组件,预测未来事件,并计划,总是计划,以进行扩展。例如,所有用户函数(或方法)都将放在用户类中。

class user {
private:
     string name;
     int    age;

public:
     void setAge(int age);
     int getAge;
     void setName(string name);
     string getName();
}

那是 C++,但概念保持不变......


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

于 2013-08-24T21:09:49.280 回答