Для модели достоверных данных я иду назад и вперед на этом...
Используя рабочий процесс одобрения как пример, скажем, в моем веб-приложении у меня есть страница, которая позволяет пользователю отметить a MyEntityObject
для одобрения. MyEntityObject
имеет несколько свойств, которые управляют его рабочим процессом одобрения, таким образом, у меня есть общий служебный метод, там названный FlagForApproval(MyEntityObject eo)
.
Страница должна назвать FlagForApproval (), чтобы установить необходимые свойства только и затем назвать SaveChanges (), когда это готово, или должны, FlagForApproval () сохраняют изменения?
Наличие служебного метода сохраняет изменения, кажется, что это делает немного больше, чем просят сделать (что, если это был всего один шаг в ряду операций?), но в то же время совершение звонка страницы SaveChanges () и передают данные DB, кажется, что это можно было считать слишком близким к обязанностям по слою данных.
Мысли?
(Обновление: FWIW, до сих пор у меня был вызов служебных методов SaveChanges (), тот способ, которым страница только имеет один набор исключений для обработки, или проверка или данные.)
Посмотрите на некоторые из этих тем . Поскольку проекты являются открытыми, вы должны иметь возможность внимательно изучить их.
-121--2304521- Как уже говорилось, причина заключается в том, что Range # каждый
отправляет succ
в его начало, затем в результат этого succ
вызова и так далее, пока результат не будет больше конечного значения. Вы не можете добраться от 4 до 0, вызвав succ
, и фактически вы уже начинаете больше конца.
Мое текущее мнение по этому вопросу заключается в том, что после проверки данных всегда следует сохранять изменения на уровне бизнес-логики. Когда пользователь нажимает кнопку «Сохранить», я передаю все объекты, которые должны быть проверены, вниз к BLL, и он решает, нужно ли ().
Мне так же любопытно, как и вам, видеть, что говорят другие, потому что эта проблема (и многие другие) мучает меня с тех пор, как я начал с EF.
Это мой опыт того, как я научился и научил себя программированию, в частности, понимание C, это восходит к началу 1990-х, так что может быть немного античным, но страсть и драйв важны:
Честно говоря, при изучении языка C++ я никогда не брал книгу (не пылайте, пожалуйста). Лучший совет, который я могу дать, это перейти на эту страницу и перейти к учебнику. Он охватывает большую часть языка C++ (читать: наиболее часто используемые функции) и сохраняет его максимально простым. Что касается API, которые важны... ну это вопрос предпочтения. Никто toolkit/api действительно «выиграл», но Qt, GTK- (gtkmm) и wxWidgets все большие игроки. Кроме GUI, вы, вероятно, захотите изучить либо необработанные API winsock2 и многопоточности, ЛИБО интерфейсы многопоточности и сети библиотеки повышения производительности. Я согласен, что MFC умирает, и для разработки только Windows C # принимает все большую роль (даже на linux/mono C # начинает зацепляться за... медленно).
Кроме того, лучшим способом изучения языка является кодирование.Так что не просто читать целый день - без практического опыта вы никогда не будете изучать язык. Задавайте вопросы, отвечайте на те, которые можете, и пишите учебники - для себя, если никто другой. Написание того, что вы узнали, является большим ориентиром, и процесс выпрямления всего в вашей голове, чтобы записать его таким образом, чтобы другой человек мог понять это в одиночку, является отличным способом укрепить концепции. Странным, но, казалось бы, обратным путем, я нашел лучший способ научиться программированию, помогая другим людям с их вопросами.
@ Neil- я не согласен с тем, что онлайн-учебники «плоские». Во всяком случае, стиль, которому они учат вас, может быть ориентирован на читаемость, а не на оптимизацию - что в моем-не-столь скромном-мнении является преимуществом. В своем ограниченном опыте я нашел cplusplus.com ссылку на практически все.
В частности, чтобы ответить на ваши вопросы: 1. Толстая книга не нужна. Я слышал, что более тонкие могут быть полезны в качестве краткого справочника.
Это полностью субъективно и зависит от вашей цели. Сетевые и многопоточные библиотеки Boost, вероятно, являются хорошим началом.
между std:: последовательность, std:: stringstream и getline (std:: istream &, std:: последовательность &). C++ поставляется с целой тонной встроенной функциональности, но не слишком раздутый/огромный/невозможно узнать. Воспользуйся этим. Весь анализ уже встроен.
Ключ состоит в разделении языка базы данных и языка службы. Если утилитный метод должен сохранять изменения, то он делает это, если не дает понять, что это не так, и необходимы дополнительные шаги. Утилита не должна иметь метод с именем, а должна иметь методы, связанные с процессом, такие как StartProcess или LoadToBatch.
Просмотрите утилиту как службу и не думайте о базе данных. «FlagForApproval» звучит как операция базы данных, попробуйте рассматривать метод как нечто вроде «StartApprovalProcess» или что-то другое, связанное с процессом. StartApprovalProcess будет выполнять всю работу и фиксацию.
Если есть несколько шагов, сделайте так, чтобы каждый шаг указывал косвенно, что может быть больше шагов. Фиксируется только последний шаг. Все, что может сделать последний шаг, это сохранить изменения, сделать считывается как процесс, такой как перемещение или запуск.
Ex:
LoadToBatchApprovement (MyEntityObject eo)
ValidateApprovalBatch ()...
MeyBatchToProcessing ()...
Я не уверен, что есть правый или неправильный ответ, но он чувствует себя чище (IMO), чтобы FlagformApplation обрабатывать процесс для запуска рабочего процесса. Это включает в себя рассказывание DataLayer для сохранения состояния объекта (I.e. Savechanges). Однако это предполагает, что у вас есть бизнес-требования, утверждающие, что после запуска рабочего процесса состояние должно быть сохранено так, если что-то происходит (I.e. Сервер аварии) Процесс рабочего процесса продолжается с последнего шага.