起初:这只是一个关于"最干净"的问题。代码方式。
我编写了一个包含多个类和函数的Python脚本/程序,用于存储一些西班牙语词汇。 最后,所有这些都汇集在接口函数中,该函数传递一些用户输入。大概是这样的:
if __name__ == "__main__":
while True:
answ = raw_input("Please select an option below:\n"
"(1) New Vocab\n"
"(2) Testing Vocabs\n"
"(3) Search vocab (Edit|Delet)\n"
"(4) List all vocabs\n"
"(5) Show Boxes\n")
#...blabla
os.system("clear")
if INPUT(answ,"1"):
IF_new_vocab(book)
book.save_dic()
elif INPUT(answ,"2"):
IF_voc_query(book)
book.save_dic()
elif INPUT(answ,"3"):
book.search_vocab()
book.save_dic()
elif INPUT(answ,"4"):
print book.show_cache() #A
elif INPUT(answ,"5"):
book.update_boxes()
book.show_boxes() #B
#...blabla
现在我的问题是: 我应该返回一个字符串并尽可能晚地使用打印,这将是"界面"在这种情况下。 (例如选项A)? 或者输出(在大多数情况下是字符串)是否应由方法/函数本身打印(例如选项B)?
我知道它根本不会影响整体输出。但我总是想知道是否有一个惯例或理由更喜欢一个选项。
答案 0 :(得分:2)
绝对有函数返回字符串并尽可能晚地打印!
提前打印会违反open-closed principle。也就是说,通常您的代码应该努力关闭以进行修改。这确保了如果您稍后决定要打印字符串输出两次,或者将字符串输出传递给API,或者将字符串输出保存在文件中,则不必修改放在一起的原始代码字符串(book.show_cache
函数)
在某些情况下,您可能希望有时打印输出,有时将其保存在文件中,有时会将其传递给API,有时还会执行其他操作。在这种情况下,如果您的代码已经打开扩展,那么您会感到最开心,这样您就可以简单地添加不同的函数/接口/处理程序来以不同的方式处理输出,而不是而不是必须重写show_cache
函数的变化3-4个不同的时间来处理不同的用法。这是strategy设计模式的基础!
然后你可能会得到这样的东西:
def print_cache():
print book.show_cache()
def save_cache_to_file():
save(book.show_cache())
def search_google_for_cache():
// google.search(book.show_cache())
比这短得多:
def print_cache():
vocab = ['hola', 'como', 'estas', 'bien', 'y', 'tu']
// more code?
print vocab
def save_cache_to_file():
vocab = ['hola', 'como', 'estas', 'bien', 'y', 'tu']
// more code?
save(book.show_cache())
def search_google_for_cache():
vocab = ['hola', 'como', 'estas', 'bien', 'y', 'tu']
// more code?
// google.search(vocab)
另外,在第二个例子中,如果你想增加更多的词汇,你必须记住在三个不同的地方做,让你的代码更容易维护!