Так что у меня есть веб-сервис, который имеет что-то вроде, getAccount
где он будет возвращать идентификатор учетной записи, если он получил его, иначе выдает исключение. Клиент всегда захочет создать учетную запись, если выдается исключение с той же информацией, с которой выполняется получение.
Я создаю удобную библиотеку для клиентов, которая будет обрабатывать все вызовы веб-службы внутри, поэтому им не нужно знать, как выполнять вызовы самостоятельно.
Что мне интересно, так это то, что в этой библиотеке я должен был создать getAccount(accountName)
учетную запись, которая получит учетную запись, если она существует, и если она не создаст ее и не вернет информацию, это плохая вещь? Должен ли я оставить это клиенту для обработки исключений или просто назвать его что-то вроде getOrCreateAccount? Это имеет значение?
Плохо ли создавать что-то в операции get?
источник
getOrCreateAccount
или подобное.acquire
, нравитсяacquireAccount
. Он не имеет существующего значения ни в каких основных протоколах, с которыми я сталкивался, и имеет императивное звено, которое ему подходит. «Делай все, что тебе нужно, чтобы приобрести один из них для меня. Проси, собирай, фальсифицируй, кради, мне все равно, просто дай мне один или умри пытаясь».getSomething()
предназначен для геттеров иsetSomething()
для сеттеров. Имо все , что делает что - то более интеллектуальное должно называться что - то другое, то естьfetchSomething
,obtainSomething
,computeSomething
или иdoSomethingElse
т.д.Ответы:
Да, это важно На мой взгляд, это вообще плохая практика - создавать что-то в процедуре, которая не документирована как обладающая способностью создания. Либо назовите эту процедуру,
getOrCreate...
либо используйте отдельнуюcreate...
процедуру, а затем, если вы действительно хотите,getOrCreate...
сначала сделайте попыткуget...
, а в случае неудачи вызовите,create...
а затем вызовитеget...
.Пользователь библиотеки, вероятно, не ожидает, что
get...
процедура создастся, если операция get завершится неудачно. Если они вдруг обнаружат, что их тестовые вызовыget...
создали целую тонну данных, они, вероятно, будут весьма удивлены. И как они убирают это? Что если они напишут код, думая, что в случае ошибки получат ошибку,get...
и они захотят справиться с этим по- своему ?источник
get...
create...
get...
только первые два. Я поговорю с клиентом о том, потребуется ли ему когда-либо возможность просто вызывать a,get
не желая создаватьcreate
в названии, просто чтобы быть на 100% ясным о том, что происходит.getOrCreate
имеет приоритет в популярной веб- средеНет, это не «плохая практика». Пока вы и другие разработчики согласны с тем, что вы хотите, чтобы это работало, это просто прекрасно. В конце концов, это будет возвращение аккаунта, чего вы и хотите. То, что учетная запись создается «под капотом», не имеет значения для звонящего.
источник
Если
getAccount()
всегда можно вернуть учетную запись, то, с точки зрения вызывающей стороны, учетная запись существует и всегда существовала. Нет необходимостиgetAccount()
создавать что-либо. Учетная запись не должна храниться где-либо, пока она не отличается от учетной записи по умолчанию.источник
GetOrCreate
это неправильная семантика, но получить объект, который может «логически» существовать, независимо от того, существует ли он физически, это нормально. Например, разреженный массив изменяемых элементов может не иметь никакого хранилища, выделенного для элемента 1 841 533, но все же позволяет этому элементу «извлекаться» путем создания нового объекта, его сохранения и возврата ссылки.Наиболее целесообразно создать 3 метода:
getAccount -> Который просто получает учетную запись.
createAccount -> Создает учетную запись.
getAccountAndCreateIfNeeded -> Выберите собственное имя;)
Почему разделение: у вас есть простой метод получения и создания. Это четкий метод тестирования для обоих. Для getAccount это не исключение, чтобы не найти аккаунт. Так что просто верните false или что-то в этом роде, это ожидается.
Затем вы можете использовать это возвращаемое значение в вашей сгруппированной функции: getAccountAndCreateIfNeeded, которая теперь также тестируема, она всегда должна возвращать учетную запись. Что бы вы ни спросили.
Все эти 3 метода понятны, совершенно ясно, что они делают и что возвращают. Вы можете заключать соглашения с вашей командой сейчас, но подобные исключения ужасны в долгосрочной перспективе. Просто сделайте их очень понятными, и у вас не будет проблем.
источник
getAccountIfExists
который либо получит учетную запись, либо покажет, что ее не существует без создания новой. СамgetAccount
метод должен предполагать, что учетная запись существует, и, если нет, генерировать исключение.Это зависит от обстоятельств.
Например, вы можете использовать его для выполнения отложенной загрузки / создания экземпляров, откладывания загрузки данных или создания экземпляра до тех пор, пока он действительно не понадобится. Обычно это разумно, так как экономит ресурсы, которые вам могут не понадобиться (если класс / данные никогда не нужны, они никогда не загружаются).
Однако в данном конкретном случае я бы сказал, что наличие метода getAccount, который создаст новую учетную запись, если ее не будет, не будет хорошей практикой. Если пользователь предоставил некоторые учетные данные для идентификации конкретной учетной записи, и эта учетная запись не может быть найдена, означает ли это, что пользователь еще не является клиентом и должен иметь учетную запись, созданную для него, или это означает, что учетные данные были напечатаны с ошибкой и нужно ли попросить пользователя подтвердить, что он ввел то, что хотел ввести?
Если у вас есть метод getAccount, который создает новую учетную запись, если он не может ее идентифицировать, у вас нет выбора в этом вопросе. Если вы разделите создание учетной записи и получение учетной записи на отдельные методы, то у вас будет гораздо больше гибкости в принятии решения о том, что делать в случае неудачной попытки получить учетную запись.
источник