`

代码重构的一点收获

    博客分类:
  • java
阅读更多

今天把以前的扫雷代码重构了一遍,有点收获

1.分清代码中结构相同的部分和不同的部分,将结构相同的部分提取出来

 之前的代码:

if (bomb == nearBombNum[x][y]) // 如果周围雷数和判断一样
				{
					if (x - 1 >= 0 && y + 1 >= 0 && x - 1 <= 19 && y + 1 <= 19
							&& !isBomb[x][y])// 边界判断,如果点击处不是地雷
					{
						changeBombImage(button[x - 1][y + 1]); // 点击处左上角判断
						if (nearBombNum[x - 1][y + 1] == 0
								&& !isBomb[x - 1][y + 1])
							showBomb(button[x - 1][y + 1]);
					}

					if (x >= 0 && y + 1 >= 0 && x <= 19 && y + 1 <= 19
							&& !isBomb[x][y]) {
						changeBombImage(button[x][y + 1]); // 点击处正上方判断
						if (nearBombNum[x][y + 1] == 0)
							showBomb(button[x][y + 1]);
					}

					if (x + 1 >= 0 && y + 1 >= 0 && x + 1 <= 19 && y + 1 <= 19
							&& !isBomb[x][y]) {
						changeBombImage(button[x + 1][y + 1]); // 点击处右上角判断
						if (nearBombNum[x + 1][y + 1] == 0)
							showBomb(button[x + 1][y + 1]);
					}

					if (x - 1 >= 0 && y >= 0 && x - 1 <= 19 && y <= 19
							&& !isBomb[x][y]) {
						changeBombImage(button[x - 1][y]); // 点击处左边判断
						if (nearBombNum[x - 1][y] == 0)
							showBomb(button[x - 1][y]);
					}

					if (x + 1 >= 0 && y >= 0 && x + 1 <= 19 && y <= 19
							&& !isBomb[x][y]) {
						changeBombImage(button[x + 1][y]);// 点击处右边判断
						if (nearBombNum[x + 1][y] == 0)
							showBomb(button[x + 1][y]);
					}

					if (x - 1 >= 0 && y - 1 >= 0 && x - 1 <= 19 && y - 1 <= 19
							&& !isBomb[x][y]) {
						changeBombImage(button[x - 1][y - 1]); // 点击处左下角判断
						if (nearBombNum[x - 1][y - 1] == 0)
							showBomb(button[x - 1][y - 1]);
					}

					if (x >= 0 && y - 1 >= 0 && x <= 19 && y - 1 <= 19
							&& !isBomb[x][y]) {
						changeBombImage(button[x][y - 1]); // 点击处正下方判断
						if (nearBombNum[x][y - 1] == 0)
							showBomb(button[x][y - 1]);
					}

					if (x + 1 >= 0 && y - 1 >= 0 && x + 1 <= 19 && y - 1 <= 19
							&& !isBomb[x][y]) {
						changeBombImage(button[x + 1][y - 1]); // 点击处右下角判断
						if (nearBombNum[x + 1][y - 1] == 0)
							showBomb(button[x + 1][y - 1]);
					}

每一个格子,都要对周围的8个格子进行处理,包括边界判断,旗子数目计算,地雷数目计算,都有相同的结构,只是不同的格子,各自的坐标不同 ,通过2个数组xLocation 和yLocation组合起来,循环8次,就能执行同样的操作了。

 

 

重构之后的代码:

int xLocation[] = { x - 1, x, x + 1, x - 1, x + 1, x - 1, x,x + 1, };
    
int yLocation[] = { y + 1, y + 1, y + 1, y, y, y - 1, y - 1,y - 1 };

if (bomb == nearBombNum[x][y]) // 如果周围雷数和判断一样
				{
					for (int i = 0; i < 8; i++) // 周围8个格子,每个格子判断一次
					{
						if (new Mybutton(xLocation[i], yLocation[i])
								.locationLegalJudge() && !isBomb[x][y]) // 边界判断,而且不是地雷
						{
							int xL = xLocation[i];
							int yL = yLocation[i];
							changeBombImage(button[xL][yL]); 							if (nearBombNum[xL][yL] == 0 && !isBomb[xL][yL])
								showBomb(button[xL][yL]);
						}
					}
				}

 

 2.边界判断

刚开始一直在边界判断上出问题,总是写一堆复杂的判断条件

 开始是这样的:

if (x - 1 >= 0 && y + 1 >= 0 && x - 1 <= 19 && y + 1 <= 19&& !isBomb[x][y]) 
if (x >= 0 && y + 1 >= 0 && x  <= 19 && y + 1 <= 19&& !isBomb[x][y])
if (x +1 >= 0 && y + 1 >= 0 && x + 1 <= 19 && y + 1 <= 19&& !isBomb[x][y])
……
……

 

上面这种方式,参数坐标一直在不断改变,很混乱

后来想了想,用构造方法的方式来解决这个问题就比较简单了

Mybutton类

Mybutton(int x, int y) {    //构造方法
    this();     // 调用无参构造方法
    this.x = x;
    this.y = y;
}

public boolean locationLegalJudge() {  //边界判断方法
 return this.x >= 0 && this.x < 19 && this.y >= 0 && this.y < 19;
	}

 然后对一个格子周围8个格子做边界判断

for(int i=0;i<8;i++)
{
  if(new Mybutton(xLocation[i],yLocation[i]).locationLegalJudge())   //边界判断
  {
    ……
  }
}  

 解决这个问题的主要思想就是,将变化的坐标,变成构造方法的参数,归一为同样的形式,用同样的方法判断就好了。

分享到:
评论

相关推荐

    代码重构.pdf

    《代码重构》一书由Martin Fowler编写,是软件开发领域中关于代码质量提升的经典之作。书中详细阐述了重构代码的必要性、重构的时机以及如何安全地重构代码。重构指的是在不改变软件外部行为的前提下,改进其内部...

    改善既有的代码重构(ppt)课件

    改善既有的代码重构(ppt),改善既有的代码重构,改善既有的代码重构PPT

    代码重构&模式

    **代码重构** 代码重构是软件开发过程中的一个重要环节,它是指在不改变代码外在行为的前提下,对代码结构、设计和实现进行改进,以提高代码的可读性、可维护性和内部结构。重构的主要目标是使软件更容易理解和修改...

    .java代码重构

    《.java代码重构》 代码重构是软件开发过程中的一个重要环节,它涉及到对现有代码的改进,以提高代码的可读性、可维护性,同时并不改变其外在行为。在Java编程中,代码重构是一种常见的实践,尤其在大型项目中,...

    代码重构PDF

    **代码重构:提升软件设计与代码质量的关键技术** 在软件开发过程中,代码重构是一个至关重要的环节,它关乎到代码的可读性、可维护性和整体性能。代码重构并不意味着添加新功能或修复错误,而是对现有代码结构进行...

    软件工程中的代码重构技术.pptx

    ### 软件工程中的代码重构技术 #### 第1章:简介 **1.1 什么是代码重构** 代码重构是一种软件工程活动,旨在不改变软件的外部行为的情况下,改进其内部结构和设计。这一过程有助于增强代码的质量和可维护性。 **...

    代码重构 (C# & ASP.NET) 英文原版

    **代码重构:C#与ASP.NET的实践指南** 在软件开发过程中,代码重构是一个至关重要的环节,它旨在改进代码的内部结构,不改变其外部行为。《代码重构 (C# & ASP.NET)》英文原版提供了针对这两种技术的重构策略和技巧...

    Python代码重构的艺术:探索自动化重构工具

    ### Python 代码重构的艺术:探索自动化重构工具 #### 一、引言 Python 作为一门高级编程语言,自1991年首次发布以来,便以其简洁易读的语法、强大的标准库支持以及广泛的跨平台特性赢得了众多开发者的青睐。随着...

    测试驱动开发及代码重构

    3. **重构**:一旦测试通过,开发者可以对新添加的代码进行重构,以保持代码简洁、清晰,并符合设计原则,同时确保所有测试仍然通过。 代码重构是TDD的重要组成部分,它是在不改变代码外在行为的前提下,改善代码的...

    java代码重构经验分享

    Java 代码重构经验分享 Java 代码重构是指在不改变外部行为的情况下,修改代码的内部结构,以提高代码的可维护性、可读性和可扩展性。本文总结了 Java 代码重构的经验和技术规范,包括重构要求、重构的工作、代码的...

    java代码重构经验总结

    ### Java代码重构经验总结 在软件开发过程中,代码重构是一项重要的技能,它旨在不改变代码外部行为的前提下,改进其内部结构,从而提升代码质量和可维护性。本文将深入探讨Java代码重构的关键点,涵盖重构原则、...

    一本介绍如何将现有的 Java 代码重构为 Kotlin 代码的书籍

    书中不仅提供了丰富的重构技巧,还包括了实用的示例和最佳实践,旨在帮助开发者更高效地完成代码转换,并提升重构后代码的质量和性能。 #### 二、重构技巧与方法 **1. 语法转换** - **基础语法差异**:Kotlin在很...

    一本代码重构的书让代码更简洁

    《重构:改善既有代码的设计》是一本由Martin Fowler所著的经典书籍,专注于讲解如何通过重构技术来提升代码质量,使其更具可读性、可维护性和扩展性。在Java编程领域,重构是提升软件开发效率和降低维护成本的重要...

    代码重构技术

    代码重构技术

    代码重构总结实例

    代码重构是一种改善软件设计、提升代码可读性和可维护性的技术。它并不改变代码的外在行为,而是通过改进代码结构来提高代码质量。在这个"代码重构总结实例"中,我们将探讨一系列相关知识点,包括重构的原因、原则、...

    Java 代码重构实例

    Java代码重构是一种优化编程实践,旨在改进代码的结构和可读性,而不改变其外部行为。重构对于提高软件质量和维护性至关重要,尤其是在大型项目中。以下是一些在Java重构中的关键原则和技巧,通过实例来展示如何应用...

    代码重构源码(包含重构前后代码)

    代码重构是一种重要的软件开发实践,旨在改进代码的结构和可读性,而不改变其外部行为。这个压缩包文件“代码重构源码(包含重构前后代码)”提供了面向对象编程领域中的一个实例,具体是对影片出租店租赁程序的重构...

    swift-高仿微信iOSAppTemplate代码重构

    这个项目名为"swift-高仿微信iOSAppTemplate代码重构",旨在通过重构代码来提升应用的可读性、可维护性和性能。在这个过程中,开发者将深入理解Swift的面向对象编程、MVVM设计模式、网络请求处理、UI布局以及数据...

Global site tag (gtag.js) - Google Analytics