Регулярные выражения удалить пустые строки


Это в принципе мой первый класс Ruby, который удаляет все пустые строки и пустые раз из .файл txt. Простой тест также включены.

Я протестировал код и он отлично работает. Но у меня не было много представление о том, если стиль кода-это хорошо, или если есть несколько возможных проблем. Может кто-то пожалуйста, сделаем краткий обзор и любезно предоставить некоторую обратную связь?

  1. Есть ли потенциальные проблемы в коде? я пропустил некоторые границы проверить?

  2. Стиль кода в целом? е.г, конвенции имя, отступ и т. д.

  3. что я могу сделать, если я хочу сделать это более профессионально? например, лучше выбор функции обработки ошибок, объектно-ориентированный, тестирование и т. д.

require 'test/unit'

class  BlankLineRemover
  def initialize()
    puts "BlankLineRemover initialized."
  end

  def generate(input_filename, output_filename)

    reader = File.read(input_filename)

    f = File.new(output_filename, "w")

    f.puts remove(reader)

    f.close

  end

  def  remove(stringToremove)

    regEx = /^[\s]*$\n/

    stringToReturn = stringToremove.gsub(regEx, '')
    stringToReturn.strip!

    if stringToReturn.length >= 1
      return stringToReturn
    else
      return ""
    end
  end

end

class TestCleaner < Test::Unit::TestCase
  def test_basic

    sInput1 = "line1\n\t\nline4\n\tline5\n"
    sExpectedOutput1 = "line1\nline4\n\tline5"

    sInput2=""
    sExpectedOutput2 = ""

    sInput3="\n\t\t\n"
    sExpectedOutput3 = ""

    testCleaner = BlankLineRemover.new
    assert_equal(sExpectedOutput1, testCleaner.remove(sInput1))
    assert_equal(sExpectedOutput2, testCleaner.remove(sInput2))
    assert_equal(sExpectedOutput3, testCleaner.remove(sInput3))

  end
end

unless ARGV.length == 2
  puts "Usage: ruby Blanker.rb input.txt output.txt\n"
  exit
end

simpleRemover = BlankLineRemover.new

simpleRemover.generate(ARGV[0],ARGV[1])


5305
2
задан 22 сентября 2011 в 03:09 Источник Поделиться
Комментарии
3 ответа

Я также хотел удалить следующее: \р\н

Кроме того, эту часть можно было бы упростить немного:

if stringToReturn.length >= 1
return stringToReturn
else
return ""
end

к:

 stringToReturn.length >= 1 ? stringToReturn : ""

Если у вас есть \р\н удален, не забудьте проверить, что. И наконец (просто вопрос стиля), я бы не стал использовать переменные верблюжьего в Ruby, как он обыкновенно делал (что я видел), так stringToremove может стать string_to_remove например.

2
ответ дан 22 сентября 2011 в 04:09 Источник Поделиться

Далее следует довольно жесткая критика, но я надеюсь, что это то, что вы ищете, как вы, кажется, хотите улучшить Руби и стиль программирования. Рубин-это прекрасный язык, но знакомство это занимает некоторое время - в конце концов ты поймешь, что все, что вы пишете используется, чтобы взять в два раза больше линий. Итак, несколько указателей:

Переменные

Как правило, в нормальных переменных Рубин подчеркнул. Поэтому вместо того, чтобы aVariableName вы должны, вероятно, использовать a_variable_name. Оба будут работать, но последняя подошла бы лучше стиль Рубина.

Кроме того, выбор имен переменных, кажется, идет от чрезмерно многословен на противоположный. Некоторые из них большие, а другие оставляют мои догадки.

Например, где вы пишете:

reader = File.read(input_filename)

Я бы предпочел писать:

in_file = File.read(in_filename)

Функции

Как ваши переменные, имена функций можно сделать с сенсорным вверх. Ваши функции не использовать неявный результат, что Руби предлагает, то, что часто считается лучшей практики.

Например, где вы пишете:

  def  remove(stringToremove)

regEx = /^[\s]*$\n/

stringToReturn = stringToremove.gsub(regEx, '')
stringToReturn.strip!

if stringToReturn.length >= 1
return stringToReturn
else
return ""
end
end

В этой связи я мог бы написать:

  def remove(stringToremove)

regEx = /^[\s]*$\n/

stringToReturn = stringToremove.gsub(regEx, '').strip
end

Также на вашем инициализировать функцию включить скобки в определениях это не требуется и не рекомендуется. Кроме того, вы не должны включать в себя инициализатор, если нет ничего ради этого делать.

Rubyness

Некоторые вещи вы могли бы хотеть рассмотреть далее, как вы сделать больше программирования в Ruby являются:


  • Приковывание. Например, вы можете сделать a_string.gsub("некоторые", "подмена").полосы.обратный и другие подобные вещи все в одну строку и сохранить читаемость высокая. Очевидно, что есть точки, где это слишком много, но это ваше суждение.

  • Форматирование кода-это немного. Во многих местах вы, кажется, используете лишние пробелы. Например, вы класс определение класса BlankLineRemover и должно быть класса BlankLineRemover. Вы могли бы использовать софт-вкладки здесь, и если это так - пожалуйста.

  • Вы разносите также очень щедры. Если вы отделяете код в отдельные куски, то вы можете пропустить несколько строк.

  • Это реальная мелочилась, А вообще используя .размер считается лучше, чем .длина.

Рерайт

Вот ваш основной класс переписать так, как я пошел бы о нем.

class BlankLineRemover
def run(in_filename, out_filename)
File.open(out_filename, "w") do |out_file|
out_file.write clean(File.read(in_filename))
end
end

def clean(input)
input.gsub(/^[\s]*$\n/, "").strip
end
end

5
ответ дан 26 сентября 2011 в 09:09 Источник Поделиться

Вот как я могу переформулировать свой основной бизнес-логикой (предупреждение -- непроверенный-вы, вероятно, следует рассмотреть этот псевдокод):

outfile = File.new(outfilename)
File.read(infilename) do |line|
unless line =~ /^[\s]*$\n/ # unless all spaces
outfile.puts(line)
end
end

Я мог бы написать класс вокруг это как "ядра" способ-обратите внимание, что один из ключей в динамическом языке, что очень важно держать уровень абстракции ваших высказываний соответствуют всей код "соседства". С точки зрения 'Rubyisms' вы могли бы продемонстрировать знание Ruby смешиваются возможности, написав AbstractFileTransformer , что вы могли бы продлить , а в том числе-ную модуль BlankLineRemovingCopyTransformation ... это было в основном просто рефакторинг класса ты написал на два, а затем создать конкретный экземпляр', которые смешивают вместе. (В качестве альтернативы вы могли бы сделать это с классами и доходности.) Если вы хотите, я могу попытаться представить пример псевдокода, но в любом случае, давайте рассмотрим тестов на мгновение.

Учитывая кажущуюся простоту функциональности, вы, конечно, можете быть прощены за написание теста баребоны. Я мог бы предложить разделение теста на несколько суб-тестов, которые вместе описывают систему. Обратите внимание, есть много разных видов анализов вы можете написать кроме того, что просто показать "как это работает" - вы можете также написать тесты об интеграции различных частей системы вместе (в отличие от испытания каждого в отдельности); вы можете писать тесты, которые предполагают предоставление заведомо системе БАД-ввод и гарантируя, что это не удается, и т. д. Вы могли бы иметь тест, который пытается вызвать свой скрипт в командной строке и проверяет поведение, как ожидалось. Стоит попробовать написать много разного рода тестов для приложения.

0
ответ дан 24 сентября 2011 в 12:09 Источник Поделиться