我很难理解OOP逻辑。例如,我注意到在诸如java或python之类的OOP语言中,程序总是在线性执行的程序中定义一些方法。我有一点C的经验,我不明白这样做的意义。
例如为什么写:
public class test {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
public void setUp() throws Exception {
FirefoxProfile profile = new FirefoxProfile(new File("C:\\Users\\User\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\sele"));
driver = new FirefoxDriver(profile);
baseUrl = "http://www.google.com";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
....
}
代替:
public class testjv {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
FirefoxProfile profile = new FirefoxProfile(new File("C:\\Users\\User\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\sele"));
driver = new FirefoxDriver(profile);
baseUrl = "http://www.google.com";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
....
}
鉴于我不打算在其他地方使用testjv类,但在此执行的文件中?
答案 0 :(得分:3)
基本假设实际上是不正确的。代码不是以线性方式执行的。例如,在JUnit测试中,用“@Before”注释的方法被重复调用(在每个“@Test”方法之前一次),类似的概念适用于旧版本的JUnit(即名为“setUp”的方法得到在名称以“test”开头的方法之前调用。使用不同的测试运行程序,可以更改调用的测试顺序(例如,有一个测试运行器的专有实现,它并行执行测试以确认被测代码实际上是线程安全的。)
但是,比这个具体情况更普遍,有几个原因可以做到这一点:
可重用性 - 将代码块分解为较小的命名单元,允许在多个不同的上下文中调用这些子单元或子例程,而无需调用整个程序。
可调试性 - 命名子代码区域允许堆栈跟踪标识发生特定错误的特定代码区域。这是一种更容易理解代码的方法,而不仅仅是查看行号(并且必须在某些先前版本中找到行号)。
隔离 - 代码的每个逻辑子部分可能不需要访问程序中使用的所有不同变量或数据。声明函数及其输入限制了访问范围,使得实现只能访问与其相关的变量。
可能有更多的好处/原因,但这些是首先想到的。
答案 1 :(得分:0)
Given that I don't intend to use testjv class elsewhere but in this executed file ?
如果您不打算将数据变量放在方法中,那么您可以将它们放在构造函数中,也可以将它放在初始化块中(两者都以相同的方式结尾) 例如,对于初始化块: -
{
driver = new FirefoxDriver(profile);
baseUrl = "http://www.google.com";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
现在OOP语言不允许对方法之外的数据变量进行操作的原因是假设在构造此类对象时,您不希望上面的代码行自动运行,如上例所示。你会怎么防止这种情况?因此,如果这些代码行在方法中,那么您可以控制在类中对数据变量执行的操作。您甚至可以覆盖这些操作并定义您自己的操作。您甚至可以通过将您的方法声明为封装来限制其他类调用您的数据修改操作。