面向对象程序练习一——游戏登陆

对于一个代码小白来说,想要实现一个项目的具体功能,可能最先想到的方法是面向过程的,但从一个优秀的代码看来,面向对象的思想是至关重要、不可或缺的。从面向过程到面向对象思维的转化与学习需要一定的时间与积累。

今天小编就带大家一起来学习一个以面向对象思维来实现的具体小功能——游戏登陆。

首先我们要了解什么是面向对象?

面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计软件开发,扩展到如数据库系统交互式界面、应用结构、应用平台、分布式系统网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

面向对象一共有四个特性,及:对象唯一性、抽象性、继承性、多态性

故名思意,面向对象实现解决的是代码的可移植性以及可多方运用性,相较于面向过程冗杂而不可移植的缺点来说大大提高了代码的可读、简便性。让基础性的代码加以组合灵活应用分配对应到不同对象上实现不同对象的功能,提高了程序效率,也给开发带来了更加广阔的平台。


项目实训——游戏登陆(Login)

了解了面向对象的重要性后,接下来我们将以一个小项目的完成来具体体现面向对象的思维,感受面向对象的妙处。

一、程序分析

回到写程序,第一步就是程序分析,以面向对象的思维的角度来入手,分析整理部分大致可分为以下几个步骤:理清功能、找对象->抽类、理清各个类中要实现的具体功能、画时序图与类图

接下来我们就来一一实现

(1)理清功能

实现游戏登陆,即是玩家来到登录页面出入账号信息,检验账号信息是否正确,显示登陆结果成功或失败

(2)找对象->抽类

用户前来登陆——存放用户信息(User)
来到游戏大厅登陆——游戏大厅类(GaneCenter)
账号信息的输入与系统提示——终端类(Console)
云端检测账号信息——服务器类(Serive)
储存正确账号信息——常量类(Constants)

(3)理清各个类中要实现的具体功能

首先作为玩家来到游戏大厅,第一步实现登陆功能,需要用户通过终端先输入自己的相关信息,得到输入的信息后来到服务器检测账号信息是否正确,此时服务器就需要拿出从原有储存好的账号信息来与输入的信息对比,如果相同,则输入正确,登陆成功,如果不相同则输入不正确,登陆失败。最后将结果返回到游戏大厅,才算完成整个登陆的过程。

(4)画时序图与类图

接下来即可根据各个类之间的关系来画时序图,时序图如下:

时序图

时序图能帮助我们理清功能的先后顺序,方便写代码时参考。


二、写代码

根据分好的各个类来分别写出各个类要实现的功能

首先是用户类(User),存放输入用户的信息

data class User(val name:String,val password:String)

游戏大厅类(GameCenter)

class GameCenter {
    lateinit var user:User
    lateinit var game:IGame
//    game as HappyPokerGame 可以将父类转换为子类
    fun login(){
        while (true){
            "请输入用户名".show()
            val name= getDate()
            "请输入密码".show()
            val password= getDate()
//        检测用户是否存在
            val result=Server.checkUser(name,password)
            if (result){
                "登录成功".showWithEnter()
                user= User(name, password)
//                如果成功就初始化创建实例User
                break
            }else{
                "用户名或密码错误,请重新登录".show()
            }
        }
        }
    }

终端(Consulo类)实现输入输出的封装,作为一个工具类,因此不需要以类来封装,写在一个文件里,作为顶层函数静态方法来使用

  fun getDate():String= readLine()!!
fun String.show()= print(this)
//实例对象方法,可用this,一句话实现直接等号
fun String.showWithEnter()= println(this)

服务器类(Server),提供检验方法,并向GameCenter类传回一个结果值

class Server(){
    companion object{
//        检测用户密码是否正确
        fun checkUser(name:String,pwd:String):Boolean{
            return name== DEFAULT_NAME && pwd== DEFAULT_PASSWORD
        }
    }
}

常量类(Constants),储存正确账号信息等一系列常量,同理与Consule一样,作为顶层函数供全局使用不需要类来封装

const val DEFAULT_NAME="jake"
const val DEFAULT_PASSWORD="123"

这样就实现了通过多个类来共同实现登陆功能,各个部分各司其职,相互作用又相互独立,实现了封装也对继续开发提供了便捷易用的基台

运行截图如下:


登陆成功运行截图

当然啦,以上代码顺序是根据时序图任务步骤的先后顺序来排列的,但在我们真实写代码时的顺序一般是倒着来的,从内容(箭头)最少的部分写起,这样从小往上堆,简单明了也更好上手


三、小结

从小程序来分析,面向对象的思维让我们实现了类的功能板块化,虽然运用到的许多类,却能十分清晰的展现出各个部分要完成的具体 功能,各司其职,相互作用又相互独立。不难发现,在此基础上还能对程序的功能进行更多的扩展,让多功能或多协作成为简单而易上手的事,这就是面向对象很妙的地方。

今天就学到这里啦,路漫漫其修远兮,我们一同加油~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。