私は自分のコードの美学について特にばかげた不安を抱いています...率直に言って、私の空白の使用は厄介です。私のコードはオタクが踊っているように見えます。それほど恐ろしいわけではありませんが、見つめていると気分が悪くなるほどぎこちなく、それでも目をそらすことはできません。
空行を残すか、行コメントの上ではなく行末コメントを使用する必要があるかどうかはわかりません。私は自分のコードの上にコメントすることを好みますが、3 語のコメントでフローを中断するのは奇妙に思えることがあります。コード ブロックの前後に空の行を挿入することは、スムーズなコード セクションにスピード バンプを挿入するようなものです。たとえば、ネストされたループでは、中央で 3 行または 4 行のコード ブロックを分離すると、インデントの視覚効果がほとんどなくなります (K&R ブレイサーは、Allman/BSD/GNU スタイルよりもこの問題が発生しにくいことに気付きました)。
私の個人的な好みは、関数/メソッド/コメント ブロック間を除いて「スピード バンプ」がほとんどない高密度のコードです。コードのトリッキーなセクションについては、何をしようとしているのか、その理由を説明する大きなコメント ブロックを残しておき、そのコード セクションにいくつかの「マーカー」コメントを続けるのが好きです。残念なことに、私は一般的に縦方向の余白を十分に楽しんでいる人がいることに気付きました。一方では、他の人がフローがあまりうまくないと考えるよりも高い情報密度を持つことができ、他方では、より低い信号対ノイズ比を犠牲にして、より良いフロー コード ベースを持つことができます。
これがとても些細で愚かなことであることはわかっていますが、残りのスキルセットを改善するために本当に取り組みたいことです.
誰かがヒントを提供してくれませんか? よく流れるコードとはどのようなものだと思いますか? また、垂直方向の空白を使用するのが適切な場所はどこですか? 2 語または 3 語のコメントに対する行末コメントについて何か考えはありますか?
ありがとう!
PSこれは、私が取り組んできたコードベースのメソッドです。私の最高ではありませんが、私の最悪ではありません。
/**
* TODO Clean this up a bit. Nothing glaringly wrong, just a little messy.
* Packs all of the Options, correctly ordered, in a CommandThread for executing.
*/
public CommandThread[] generateCommands() throws Exception
{
OptionConstants[] notRegular = {OptionConstants.bucket, OptionConstants.fileLocation, OptionConstants.test, OptionConstants.executable, OptionConstants.mountLocation};
ArrayList<Option> nonRegularOptions = new ArrayList<Option>();
CommandLine cLine = new CommandLine(getValue(OptionConstants.executable));
for (OptionConstants constant : notRegular)
nonRegularOptions.add(getOption(constant));
// --test must be first
cLine.addOption(getOption(OptionConstants.test));
// and the regular options...
Option option;
for (OptionBox optionBox : optionBoxes.values())
{
option = optionBox.getOption();
if (!nonRegularOptions.contains(option))
cLine.addOption(option);
}
// bucket and fileLocation must be last
cLine.addOption(getOption(OptionConstants.bucket));
cLine.addOption(getOption(OptionConstants.fileLocation));
// Create, setup and deploy the CommandThread
GUIInteractiveCommand command = new GUIInteractiveCommand(cLine, console);
command.addComponentsToEnable(enableOnConnect);
command.addComponentsToDisable(disableOnConnect);
if (!getValue(OptionConstants.mountLocation).equals(""))
command.addComponentToEnable(mountButton);
// Piggy-back a Thread to start a StatReader if the call succeeds.
class PiggyBack extends Command
{
Configuration config = new Configuration("piggyBack");
OptionConstants fileLocation = OptionConstants.fileLocation;
OptionConstants statsFilename = OptionConstants.statsFilename;
OptionConstants mountLocation = OptionConstants.mountLocation;
PiggyBack()
{
config.put(OptionConstants.fileLocation, getOption(fileLocation));
config.put(OptionConstants.statsFilename, getOption(statsFilename));
}
@Override
public void doPostRunWork()
{
if (retVal == 0)
{
// TODO move this to the s3fronterSet or mounts or something. Take advantage of PiggyBack's scope.
connected = true;
statReader = new StatReader(eventHandler, config);
if (getValue(mountLocation).equals(""))
{
OptionBox optBox = getOptionBox(mountLocation);
optBox.getOption().setRequired(true);
optBox.requestFocusInWindow();
}
// UGLY HACK... Send a 'ps aux' to grab the parent PID.
setNextLink(new PSCommand(getValue(fileLocation), null));
fireNextLink();
}
}
}
PiggyBack piggyBack = new PiggyBack();
piggyBack.setConsole(console);
command.setNextLink(piggyBack);
return new CommandThread[]{command};
}