gpt4 book ai didi

java - 方法与分解

转载 作者:行者123 更新时间:2023-12-01 05:45:57 25 4
gpt4 key购买 nike

经过几年的 HTML/CSS 编码,我刚刚开始学习 Java,所以希望我不会在这里问一个老问题或愚蠢的问题,但如果能帮助解释这个问题,我们将非常感激。

我目前正在学习斯坦福 CS106A 在线 Material ,已经完成第 6 周,作业 2,问题 3 (http://see.stanford.edu/materials/icspmcs106a/13-assignment-2-simple- java.pdf)。

正如您所看到的,它需要在屏幕上放置各种对象来创建图形层次结构,如上所述。我的计划是使用中心坐标来相对放置屏幕上的所有对象。然而我遇到了一个我似乎找不到答案的问题。该类(class)描述了方法分解应如何允许每个方法处理一个问题(我相信单一职责原则),因此我编写了代码的第一部分,如下所示:

//Import any libraries
import acm.program.*;
import acm.graphics.*;

public class GraphicsHierarchy extends GraphicsProgram {

//Define constants
static final int BOX_WIDTH = 200;
static final int BOX_HEIGHT = 75;



public void run() {
placeGRect();
}

//Find centre x & y
double centre_x = getWidth() / 2; //check this
double centre_y = getHeight() * 0.5;//and this

//placeGRect method
public void placeGRect() {
for (int count = 0; count < 4; count++) {
GRect box = new GRect (BOX_WIDTH, BOX_HEIGHT);
add(box);
switch (count) {
case 0:
box.setLocation(centre_x, 75);
break;
case 1:
box.setLocation((centre_x * 0.5), 250);
break;
case 2:
box.setLocation(centre_x, 250);
break;
case 3:
box.setLocation((centre_x * 1.5), 250);
break;
}
}
}
}

但是,由于 center_x 和 center_y 产生零值,因此这不起作用。我通过将程序更改为 ConsoleProgram 并在 run() 方法中包含 getWidth 和 getHeight 行(并在屏幕上打印它们的值)发现了这一点,然后生成所需的值,但没有将它们传递给 GRect 方法(因此还是没用)。但是,如果我在 run() 中列出了 getWidth/getHeight 行,那么它们不会产生任何相对定位值。

我的问题是,每个方法都应该处理一个任务,并且(尽可能多)方法应该在 run() 方法之外定义,那么我如何才能将 getWidth/getHeight 值获取到 placeGRect() 方法run() 方法中没有一大块代码。我认为这是不好的做法。

我并不需要任何代码来解决这个问题,我真的需要理解它的原理,这样我才能在将来编写有效的代码。我更喜欢理解而不是鹦鹉学舌式的代码复制。

预先感谢您的帮助。

最佳答案

在您的具体示例中:

您已将 centre_xcentre_y 声明为实例变量。当您的程序首次创建 GraphicsHierarchy 实例时,对象创建的顺序如下:

  1. ClassLoader 加载类...静态变量(BOX_WIDTHBOX_HEIGHT)被分配指定值;

  2. 在堆上为 GraphicsHierarchy 的实例分配空间(有足够的空间来保存实例变量 - centre_xdouble > 和一个 double 表示 centre_y - 包括基类实例变量的空间)

  3. 实例变量设置为默认值:centre_x = 0、centre_y = 0

  4. 调用 GraphicsHierarchy 默认构造函数(除了调用基类构造函数 - GraphicsProgram 之外不执行任何操作)。

  5. 基类将执行步骤 1-4,执行完成后返回到 GraphicsHiearchy,它现在会在执行任何剩余的构造函数语句之前评估显式实例变量初始值设定项(在以下情况下)默认构造函数,没有)。

(此过程的附加引用 http://java.dzone.com/articles/java-object-initialization )

话虽如此,当您的类 GraphicsHierarchy 到达步骤 5 并尝试为 centre_xcentre_y 分配值时,情况似乎如此>,getWidthgetHeight 所依赖的子系统尚未准备好(即尚未创建窗口或 Canvas ,因此方法返回 0)。但是,当您将分配移到 run 中并且 getWidth/getHeight 返回值时,这意味着调用 run 的任何方法都首先完成了必要的窗口创建步骤。

艾蒂安·德·马特尔的建议很好。它会延迟中心值的分配,直到需要它们之前。如果您愿意,可以创建一个 init 方法并将赋值移到 init 方法内,然后调用 init 作为 run 的第一步

private void init() {
centre_x = getWidth / 2;
centre_y = getHeight * 0.5;
}

public void run() {
init();
placeGRect();
}

这与 Martel 的建议几乎相同,尽管如果您稍后发现需要执行其他初始化代码,您可以将其放在同一位置。

对于编写灵活的代码,您可能会考虑将 placeGRect 重命名为 placeGRects 并传入点数组(如果您愿意,也可以传入 Collection)placeGRects(Point[ ] 点)

(您可以使用Java.awt.Point或定义自己的Point类)

这样,你的 placeGRects 方法就被简化了。它不再决定渲染多少个盒子(由传入的数组决定)。它也无法确定这些新框的位置(同样由 Point 对象数组确定)。它只是循环遍历数组的大小,创建一个新框,添加它,然后设置位置。

private Point[] boxPoints;

public void run() {
init();
placeGRects(boxPoints);
}

public void placeGRects(Point[] points) {
for(int i=0;i<points.length;i++) {
GRect b = new GRect(BOX_WIDTH,BOX_HEIGHT);
add(b);
b.setLocation(points[i].x,points[i].y);
}
}

您可以将 Point 数组初始化放入新的 init() 方法中。

private void init() {
centre_x = getWidth / 2;
centre_y = getHeight * 0.5;
boxPoints = {new Point(centre_x, 75),new Point(centre_x * 0.5, 250)};
}

它使您的代码在需要时更易于理解和修改。

关于java - 方法与分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5899184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com