これは正しいですか?
コード例:
void foo(E param){
if(param == null){
// do this
}else{
// do that
}
//...
}
まず最初に、変数を null にできるようにすることについて議論している人々がソフトウェアに複雑さを追加するいくつかの投稿を読みました。
想い(私の想い)
初心者の私の考えは間違っているかもしれませんが、これを解決するのを手伝ってもらいたいです。
変数が nullであるかどうかを確認することは、その変数が であるコンテキストに応じて正しいと思います。例を挙げて説明しましょう。
悪い使い方:
私たちのプロジェクトには Command パターンが実装されており、一連の命令があります。次に、コンソールに命令を書き込み、それを解釈する必要があります。それを解析しようとするインタープリタークラスがあるため、インタープリターが適切な命令を見つけることができない場合、null を返します。
コード例:
public class Interpreter {
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
private static final List<Instruction> listInstructions = loadInstructions();
/**
* Generates a new instruction according to the user input
* @param line - A string with the user input
* @return The instruction read from the given line. If the instruction is not correct, then it returns null.
*/
public static Instruction generateInstruction(String line) throws WrongInstructionFormatException
{
Instruction instru = null;
Iterator<Instruction> it = listInstructions.iterator();
int i = 0;
while(it.hasNext() && i <9 && instru == null)
{
try
{
instru = it.next().parse(line);
}
catch(WrongInstructionFormatException e)
{
}
finally
{
i++;
}
}
return instru;
}
//...
public class MainClass
{
/**
* MainFunction
*/
public void mainFuction()
{
Instruction instru;
while(true)
{
instru = Interpreter.generateInstruction(orden);
if(instru == null) <------
// Error.
else
instru.execute();
}
}
}
この場合、インタープリターは null を返してはならず、例外を返してはならないため、これを間違って実装していると思います。私が明確であることを願っています。そうでない場合は、後でコメントで明確にしたいと思います
正しい使い方: (編集済み)
私たちのプロジェクトのメイン クラスには、両方をインスタンス化できる、またはインスタンス化できない一連の属性があります。1 つをインスタンス化したか、両方をインスタンス化したか、どちらもインスタンス化しなかったかに応じて、1 つ、2 つ、またはまったくアクションを実行しない一連の関数が存在します。
public class MainClass extends Observable
{
private A a;
private B b; // This attribute allows you to start making a log in a txt file
private C c; // This attribute allows you to start making a log in a DB
public MainClass(A a){ //....}
public MainClass(A a, B b) { // .....}
public MainClass(A a, C c) { // .....}
public MainClass(A a, B b, C c){ //.....}
public void log(String update)
{
if(this.b != null) <-----
// Save the update in the txt file
if(this.c != null) <-----
// Save the update in a db row
}
}
さて、なぜこれが正しいのですか?前のケースとは異なり、属性に null 値が含まれている可能性があるため、正しいと思います。
これで議論が始まります。他の人が同じ疑問を持っている場合は、それが助けになることを願っています.