为什么要在编码之前考虑程序设计?
亚伯拉罕·林肯(Abraham Lincoln)说,给我六个小时的时间来砍树,我将用头四个时间来削斧头。此声明也适用于软件开发。事实是,为了开发出色的软件,您必须围绕软件组件的设计和交互进行大量思考。
为什么要花时间在程序设计上?如果你花时间考虑您的程序设计将花费更少的时间进行编码。
按照亚伯拉罕·林肯的报价,您将花费33.3%的时间进行编码。这是因为在程序设计之后,您知道了必须编写的所有类和方法,以及它们将如何更改程序的状态(数据)。它将帮助您将程序视为一组相互交互的模块,从而使程序模块化
。对程序进行模块化将简化开发过程中的任务分配。它将帮助您编写更好的代码,因为您将不得不考虑程序分解和逐步优化。
总而言之,在编码之前考虑程序设计将使您成为一名更好的软件工程师和程序员。
为什么要使用井字游戏作为我们的案例研究?
Tic-Tac-Toe(井字游戏)是一款纸笔游戏,面向X和O两个玩家,他们轮流在3×3网格中标记空格。成功将三个标记放在水平,垂直或对角线上的玩家将赢得比赛。以下示例游戏由第一位玩家X赢得(En.wikipedia.org,2018):
玩家很快就会发现,双方的最佳表现会导致平局。因此,井字游戏最常由年幼的孩子玩(En.wikipedia.org,2018)。
我选择Tic-Tac-Toe作为我们的案例研究,因为它相对容易编程,并且使我有机会谈论
一些关键的软件工程技术。您可以在以下链接中找到代码:在Github上给我发消息
设计更好程序的策略
分解
- 作为计算机科学家,我们知道要解决一个大问题,我们需要将其分解为较小的问题并解决这些较小的问题。在软件设计中,我们做的完全相同。为了开发井字游戏,我将其分解为以下几部分:
- 初始化玩家-获取玩家的名字,为他们分配绘画符号和ID。
- 初始化游戏网格-绘制Tic-Tac-Toe网格,并为Players设置初始回合。
- 等待玩家开始游戏
- 如果有玩家玩过,请检查获胜情况
- 如果有胜利,请询问玩家是否要继续比赛。
- 如果他们想继续玩,请重置游戏网格并重置玩家的回合(返回2),否则声明游戏的获胜者并退出程序。
- 如果没有获胜,则交替转弯并回到3。
这是我开发该软件的最初策略。当我开始编写代码时,我不得不改变这种策略,我意识到游戏中大多数玩家的动作将是MouseClick事件,而我将必须通过实现事件侦听器来处理它们。
编程范例
- 在处理软件项目时,建议在编写代码时选择要使用的编程范例。对于井字游戏,我使用的是面向对象的编程范例。这意味着,我围绕类和接口设计了整个程序。
- TicTacToe类-此类包含我们程序的主要方法。
- GameBoard类-此类实现我们的游戏板并处理其上的所有交互。
- 玩家类别-此类代表游戏中的玩家,并且还存储该玩家的属性。
除了这些类之外,这些类还共享一个GameConstants接口。该接口指定游戏所需的所有常量。
良好名称和方法长度
- 编程时,请确保您的类的名称、方法的名称、变量的名称和常量的名称反映了该类所代表的含义或它们的作用。好的类、方法、变量和常量名将减少您要做的注释量。我所有的班级名称都反映了每个班级的作用或代表什么。
- 好的方法名称示例-initGrid(初始化井字游戏网格),checkForWin(玩家玩完后检查玩家是否获胜),drawCircle(在网格单元上绘制圆圈),drawCross(在网格单元上绘制十字) )和recordScore(记录特定玩家的得分)。
- 良好变量名称的示例-scoreBoard(用于跟踪玩家得分的数组),boardState(用于跟踪板状态的Grid单元的数组)
- 良好常量名称的示例-NUM_OF_PLAYERS(表示游戏中的玩家数量),NUM_GRID_ROWS(游戏网格中的行数),NUM_GRID_COLUMNS(游戏网格中的列数)
版本控制
每当您在进行项目时,请确保先使用Git或您选择的任何其他版本控制工具初始化存储库。无论何时向代码添加新功能,都要确保执行并提交这些更改。阶段和提交经常发生,不要等到你达到了一个重要的里程碑才开始阶段和提交更改。
原文链接:https://dev.to//vladimirfomene/how-to-design-computer-programs-3ibp