Обычно я трачу много времени на отладку своих программ, чтобы убедиться, что они делают то, во что я верю. Однако, когда я закончил отладку, повсюду оказалось много ненужных println. Есть ли способ не выбросить эту работу и оставить ее на потом? Я знаю, что вы можете написать для этого модульный тест и прикрепить туда «println», но я бы предпочел не создавать структуру для каждой маленькой программы, которую я пишу.
Я предлагаю создать файл отладки и чистый файл и просто сохранить оба. Есть ли у кого-нибудь еще хорошая идея для этого? В качестве примера, вот моя почти законченная программа scala для решения проблемы «Шерлок и действительная строка» на Hackerrank глянь сюда.
import java.io.PrintWriter
import scala.collection.mutable.ListBuffer
import scala.collection.mutable.{Set => MutSet}
import scala.collection.mutable.{Map => MutableMap}
import scala.collection.mutable.{ListBuffer}
object Solution {
/**
@TODO "Sherlock and the Valid String", Strings
*/
// Complete the isValid function below.
def isValid(s: String): String = {
// Count frequencies
var freqmap = Map[Char, Int]()
var old = 0
for (c <- s) {
old = freqmap.getOrElse(c, 0) + 1
freqmap = freqmap + (c -> old)
}
println(s"Counts of characters in string:\n" + freqmap.mkString(", \n"))
// Check if problems or okay
var oneDeviation = false
var initFreq = freqmap(s(0))
val allowedFreqs = ListBuffer(initFreq)
val counter = MutableMap[Int, Int](initFreq -> 1)
var isFreqOne = false
var freqThatIsOne: FreqIsOne = None
println(s"Init freq: $initFreq")
println(s"counter: " + counter.mkString(", \n"))
println()
for (freq <- freqmap.values) {
println("------------------")
println(s"Freq: $freq")
if (!oneDeviation) {
if (freq != initFreq) {
oneDeviation = true
// greater than 1 diff and no freq is 1 , eg 2 and 4
// if pass this we know diff is 1
if (isBiggerThanOneDiffAndNoOneFreq(initFreq, freq)) {
return "NO"
}
// check if we have a freq that is one
if (initFreq == 1 || freq == 1) {
// one freq which is 1
if (initFreq == 1) {
isFreqOne = true
freqThatIsOne = Init
// only freq allowed
allowedFreqs.remove(0)
allowedFreqs += freq
} else if (freq == 1) {
isFreqOne = true
freqThatIsOne = Freq
// only allowed is initFreq
}
// one diff but larger than 1 freqs, only allowed
// is the lower frequency
} else {
if (freq > initFreq) {
allowedFreqs.remove(0)
allowedFreqs += freq
}
}
// no new freq
} else {
}
} else {
if (!allowedFreqs.contains(freq)) return "NO"
}
old = counter(initFreq)
counter(initFreq) = old + 1
println(s"counter: " + counter.mkString(", "))
}
"YES"
}
def isBiggerThanOneDiffAndNoOneFreq(initFreq: Int, freq: Int): Boolean = {
math.abs(freq - initFreq) > 1 && (initFreq != 1 && freq != 1)
}
sealed trait FreqIsOne
case object Init extends FreqIsOne
case object Freq extends FreqIsOne
case object None extends FreqIsOne
def main(args: Array[String]) {
val stdin = scala.io.StdIn
val s = stdin.readLine
val result = isValid(s)
println(result)
}
}
Или, может быть, научитесь использовать отладчик, чтобы вам не нужно было заполнять свой код отпечатками, или, может быть, научитесь писать хороший код, удалив всю эту ненужную изменчивость и разделив такую большую функцию на более мелкие с помощью надлежащего модульного тестирования, чтобы вы не нужно этого делать.




Используйте структуру ведения журнала, которая позволяет контролировать уровень журнала для каждого компонента (например, scala-logging), и оставьте там код отладки на тот случай, если он вам снова понадобится.
Хорошо! Благодарю вас <3
почему бы не использовать библиотеку журналирования, такую как Apache Log4j 2