Как сделать существующий общедоступный API тестируемым для внешних программистов, использующих его?

Если префаб настолько велик, то, может быть, просто ваше устройство не способно отобразить его в нужном вам f / s.

Также возможно, что лаги возникают не из самой модели, а из-за инициализации (Awake, OnEnable) обращений к компонентам, прикрепленным к этому объекту.


Если при создании экземпляра происходит только медленно, вы должны использовать Instantiate() только один раз в Awake или Start и отключать / включать объекты только тогда, когда они не нужны, через SetActive ( каким-то образом, что делает пул объектов).

Если задействовано больше сцен, вы должны использовать DontDestroyOnLoad для переноса их на другие сцены.


Вы можете попробовать использовать что-то вроде

async Task LoadModelAsync()
{
    var assetBundle = await GetAssetBundle("www.my-server.com/myfile");
    var prefab = await assetBundle.LoadAssetAsync("myasset");
    GameObject.Instantiate(prefab);
    assetBundle.Unload(false);
}

async Task GetAssetBundle(string url)
{
    return (await new WWW(url)).assetBundle;
}

(см. Как использовать Async-await в Unity3d - только то, что они пропускают ; после (await new WWW(url)).assetBundle ])

и используйте его, например, как

private void Awake()
{
    InstantiateAsync();
}

async void InstantiateAsync()
{
    // Example of long running code.
    await LoadModelAsync();
}

(см. Здесь для еще лучших решений ). Но имейте в виду, что объект не будет их сразу же, а будет создан позже.


Или вы можете войти в новую систему заданий Unity , которая кажется еще быстрее ( заявлено здесь )

6
задан Community 23 May 2017 в 12:30
поделиться

6 ответов

То, что Вы действительно спрашиваете, "Как я разрабатываю свой API с ТВЕРДЫМИ и подобными принципами в памяти, таким образом, мой API играет хорошо с другими?" Это не примерно тестируемость. Если у Ваших клиентов есть проблемы при тестировании их кода с Вашим, то у них также есть проблемы при ЗАПИСИ/ИСПОЛЬЗОВАНИИ их кода с Вашим, таким образом, это - большая проблема, чем просто тестируемость.

Просто извлечение интерфейсов не решит проблему, потому что вероятно Ваши существующие интерфейсы класса (что реальные классы выставляют как их методы/свойства), не дизайн с Интерфейсным Принципом Сегрегации в памяти, таким образом, извлеченный интерфейс имел бы все виды проблем (некоторые из которых Вы упомянули в комментарии предыдущему ответу).

Мне нравится называть это проблемой IHttpContext. ASP.NET, как Вы знаете, очень трудно протестировать вокруг или с должным к "Волшебной проблеме" Зависимости от Singleton HttpContext. Текущий. HttpContext не mockable без необычных приемов как то, что использует TypeMock. Просто извлечение интерфейса HttpContext не собирается помогать так многому, потому что это НАСТОЛЬКО огромно. В конечном счете даже IHttpContext стал бы нагрузкой для тестирования с так так, чтобы это почти не стоило сделать больше, чем попытка дразнить сам HttpContext.

Идентификация объектных обязанностей, разрезание взаимодействуют через интерфейс, и взаимодействия соответственно, и разрабатывающий с Открываются/Закрывают, Principle в памяти не что-то Вы, и попытайтесь вынудить/переполнить в существующий API, разработанный без этих принципов в памяти.

Я очень не хочу оставить Вас с таким мрачным ответом, таким образом, я дам Вам, одно положительное предлагает: как о ВАС, берут все горе от имени Ваших клиентов и делают своего рода слой сервиса/фасада по вершине Вашего старого API. Этот уровень служб должен будет иметь дело с мелочами и болью Вашего API, но представит хороший, чистый, ТВЕРДО-ДРУЖЕСТВЕННЫЙ общедоступный API, который Ваши клиенты могут использовать с намного меньшим количеством трения.

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

4
ответ дан 17 December 2019 в 00:15
поделиться

Другой подход должен был бы создать отдельное ответвление API и сделать опцию 3 там. Затем Вы просто поддерживаете эти две версии и удерживаете от использования первого. Слияние изменений от одного ответвления в другой должно работать автоматически большую часть времени.

2
ответ дан 17 December 2019 в 00:15
поделиться

Как ответ на Ваше редактирование, интерфейсное извлечение действительно работает очень хорошо здесь:

public interface IUserRepository
{
    IUserData GetData(string userName);
}

public class UserRepository 
    : IUserRepository
{
    // The old method is not touched.
    public UserData GetData(string userName)
    {
        ...    
    }

    // Explicitly implement the interface method.
    IUserData IUserRepository.GetData(string userName)
    {
        return this.GetData(userName);
    }
}

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

1
ответ дан 17 December 2019 в 00:15
поделиться

Один подход, который Вы не упоминаете (и тот я предпочел бы в большинстве случаев) должен извлечь интерфейсы для классов, которые Вы хотите, чтобы пользователь API смог фальсифицировать. Не зная Ваш API не каждый класс в нем должен иметь, это - извлеченный интерфейс.

0
ответ дан 17 December 2019 в 00:15
поделиться

Сторонние пользователи не должны тестировать Ваш API. Они хотели бы протестировать свой код против Вашего API и таким образом, они должны создать Насмешки для API и т.д., но они полагались бы на Ваше тестирование API, чтобы гарантировать, что это работает. Или это, что Вы имели в виду? Вы хотите сделать свой API легким протестировать против?

Запустите снова в этом случае и на этот раз думайте о тестерах :)

0
ответ дан 17 December 2019 в 00:15
поделиться

Я соглашаюсь с Kim. Для почему бы не переписывания базового API с помощью лучших практик, Вы объяснили, и предоставление ряд классов прокси/адаптера, которые выставляют старый интерфейс, но говорят с Вашим новым API?

Старые разработчики будут естественно поощрены мигрировать на новый API, но не быть вынужденными сразу сделать так. Новые разработчики будут просто использовать Ваш новый API. Объявите о EOL для своего старого API-интерфейса, если Вы обеспокоены разработчиками, остающимися на старом API.

0
ответ дан 17 December 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: