Я думал об этом том же самом много в последнее время; я был активным пользователем CSLA некоторое время, и я люблю чистоту высказывания, что "вся Ваша бизнес-логика (или по крайней мере так, как довольно возможно) инкапсулируется в предприятиях".
я видел, что модель предприятия обеспечивает много значения в случаях, где дизайн базы данных отличается, чем способ, которым Вы работаете с данными, которые имеют место в большом количестве программного обеспечения для бизнеса.
, Например, идея "клиента" может состоять из основной записи в таблице Customer, объединенной со всеми заказами, которые клиент разместил, а также сотрудники всего клиента и их контактная информация, и некоторые свойства клиента и его детей могут быть определены от справочных таблиц. Действительно хорошо с точки зрения разработки смочь работать с Клиентом как единственный объект, так как с бизнес-точки зрения, понятие о Клиенте содержит все эти вещи, и отношения могут или не могут быть осуществлены в базе данных.
, В то время как я ценю кавычку, что, "если Ваше бизнес-правило не находится в Вашей базе данных, это - только предложение", я также полагаю, что Вы не должны разрабатывать базу данных для осуществления бизнес-правил, необходимо разработать ее, чтобы быть эффективными, быстро и нормализованный.
Тем не менее, поскольку другие отметили выше, нет никакого "идеального дизайна", инструмент должен соответствовать заданию. Но использование предприятий может действительно помочь с обслуживанием и производительностью, так как Вы знаете, куда пойти для изменения бизнес-логики, и объекты могут смоделировать реальные понятия интуитивным способом.
У вас было хорошее начало. Попробуйте сделать это в своем цикле:
for line in lines:
line = line[2:]
# do something here
Синтаксис [2:] называется " slice ", по сути, он говорит: «Дайте мне часть этой последовательности, которая начинается с индекса 2 и продолжается до конца (поскольку конечная точка не была указана после двоеточия).
Нарезка строк поможет вам:
>>> a="Some very long string"
>>> a[2:]
'me very long string'
Вместо использования цикла for вы могли бы быть более довольны пониманием списка:
[line[2:] for line in lines]
В качестве любопытства проверьте инструмент unix cut
.
$ cut -c2- filename
Синтаксис нарезки для -c очень похож на синтаксис Python.
Если вы хотите изменить содержимое файла, а не просто обработать строку, попробуйте fileinput
параметр inplace
:
# strip_2_chars.py
import fileinput
for line in fileinput.input(inplace=1):
print line[2:]
Затем, командная строка:
python strip_2_chars.py m:\file.txt
В качестве подсказки вы можете сократить свою программу до
for line in open('M:/file.txt'):
line = line[2:]
. А если вам нужно перенести номер строки, используйте
for i, line in enumerate(open('M:/file.txt.')):
line = line[2:]
Когда есть только один уровень наследования, вы можете использовать шаблон метода шаблон , где открытый интерфейс не является виртуальным и вызывает функцию виртуальной реализации. Затем логика базы переходит в публичную функцию, которая гарантированно будет вызвана. Я обнаружу, что в Python есть несколько отличных способов работы со строками. Некоторые другие полезные строковые методы, которые вы, возможно, захотите проверить, - это такие как split (), replace () и startwith () / endwith ().
Может быть интересно узнать, что есть тонкое, но важное различие между:
file = open( filename )
lines = file.readlines()
for line in lines:
do something
и
file = open( filename )
for line in file:
do something
Первое решение (с строками чтения
) загрузит все содержимое файла в памяти и вернуть список Python (строк). С другой стороны, второе решение использует нечто, называемое итератором
. Это фактически переместит указатель в файле по мере необходимости и вернет строку. Это имеет важное преимущество: файл не загружается в память. Для небольших файлов подходят оба подхода. Но пока вы работаете с файлом только построчно, я предлагаю использовать поведение итератора напрямую.
Итак, мое решение было бы:
infile = open( filename )
outfile = open( "%s.new" % filename, "w" )
for line in infile:
outfile.write( line[2:] )
infile.close()
outfile.close()
Подумайте об этом: если это не-ascii файл (например, в кодировке latin-1), рассмотрите возможность использования codecs.open . В противном случае вас может ждать неприятный сюрприз, поскольку вы можете случайно разрезать многобайтовый символ пополам;)
Однако, если вам не нужен python, и единственное, что вам нужно сделать, это обрезать первые два символа из файла, то самый эффективный способ сделать это - предложить kch и использовать cut
:
cat filename | cut -d2- > newfile
Для таких быстрых и грязных операций с файлами у меня всегда установлен cygwin на моем не- Linux Boxen. Но я считаю, что для этих инструментов есть набор двоичных файлов Windows, которые будут работать быстрее, чем в cygwin iirc.
Предложение и использование cut
:
cat filename | cut -d2- > newfile
Для таких быстрых и грязных файловых операций у меня всегда установлен cygwin на моем компьютере, отличном от Linux. Но я считаю, что для этих инструментов есть набор двоичных файлов Windows, которые будут работать быстрее, чем в cygwin iirc.
Предложение и использование cut
:
cat filename | cut -d2- > newfile
Для таких быстрых и грязных файловых операций у меня всегда установлен cygwin на моем компьютере, отличном от Linux. Но я считаю, что для этих инструментов есть набор двоичных файлов Windows, которые будут работать быстрее, чем в cygwin iirc.
Поскольку вы изучаете Python, я хотел бы добавить это, учитывая инструменты, предлагаемые Python (нарезка, разделение, замена и все другой, о котором упоминалось), вы обнаружите, что для многих задач регулярные выражения излишни. Таким образом,
import re
в начале вашего примера может быть или не быть строго необходимым.