Я наконец представил свой первый PR в моей жизни

Открытый исходный код

Сегодня яhaloОтправила первый раз в жизниpull request, Оптимизирована логика загрузки вложений. Главное, что я успешно сделал первый шаг к open source.

причина вопроса

Эпидемия дома, и времени достаточно;

Больше не уходи, оставим колебания;

Тихий и задумчивый, сидячий и учёный;

Проект торопится первым, и осенний рекрут обязателен;

Напишите сетевой диск, размажьте глаза;

Что ты не можешь сделать? рыться в Git;

Здравствуйте, у меня есть возможность учиться из первых рук;

Меч убивает дракона, идея уже есть;

Сделайте волну, оглянитесь, привет;

Частично избыточный, практический;

Опрос не прост, привилегии Hash;

Просто делайте то, что вы говорите, давайте начнем кодировать;

Модифицированные модули

В halo существуют различные способы хранения подключенного модуля изображения, такие какSMMS,Али ОСС,Тенсент COSЖдать. Вначале halo сохраняет его в LinkList, использует шаблон стратегии (или адаптер?) для предоставления унифицированного метода в FileHandler, а затем вызывает различные реализации в соответствии с параметрами. Это приводит к необходимости просматривать LinkList каждый раз при загрузке вложения. Естественно, проще думать, что можно использовать Map для хранения данных, и тогда можнополучить необходимые ресурсы в установленные сроки. Но для контейнера серии Map нужно использовать ключ. Здесь, поскольку все вышеперечисленные методы хранения реализуют самоунифицированный интерфейс, я добавил в интерфейс новый метод.getTypeВернитесь к типу хранилища, поддерживаемому конкретной реализацией, а затем немного измените логику, чтобы сделать ее более понятной.

Вот часть, где я изменил большее влияние

До замены (1)

@NonNull
public UploadResult upload(@NonNull MultipartFile file, @NonNull AttachmentType attachmentType) {
public UploadResult upload(@NonNull MultipartFile file, @NonNull AttachmentType attachmentType) {
Assert.notNull(attachmentType, "Attachment type must not be null");
return upload(file, attachmentType.name());
}
}


/**
* Uploads files.
*
* @param file multipart file must not be null
* @param type store type
* @return upload result
* @throws FileOperationException throws when fail to delete attachment or no available file handler to upload it
*/
@NonNull
public UploadResult upload(@NonNull MultipartFile file, @Nullable String type) {
Assert.notNull(file, "Multipart file must not be null");

for (FileHandler fileHandler : fileHandlers) {
if (fileHandler.supportType(type)) {
return fileHandler.upload(file);
}
}

throw new FileOperationException("No available file handlers to upload the file").setErrorData(type);
}

После замены (1)

@NonNull
public UploadResult upload(@NonNull MultipartFile file, @NonNull AttachmentType attachmentType) {
return getSupportedType(attachmentType).upload(file);
}

До изменения

public void delete(@NonNull Attachment attachment) {
Assert.notNull(attachment, "Attachment must not be null"

getSupportedType(attachment.getType())
delete(attachment.getType().name(), attachment.getFileKey());
}

/**
* Deletes attachment.
*
* @param key file key
* @throws FileOperationException throws when fail to delete attachment or no available file handler to delete it
*/
public void delete(@Nullable String type, @NonNull String key) {
for (FileHandler fileHandler : fileHandlers) {
if (fileHandler.supportType(type)) {
// Delete the file
fileHandler.delete(key);
return;
}
}

throw new FileOperationException("No available file handlers to delete the file").setErrorData(type);
}

После модификации (2)

public void delete(@NonNull Attachment attachment) {
Assert.notNull(attachment, "Attachment must not be null");
getSupportedType(attachment.getType()).delete(attachment.getFileKey());
}

новый метод

private FileHandler getSupportedType(AttachmentType type) {
FileHandler handler = fileHandlers.getOrDefault(type, fileHandlers.get(AttachmentType.LOCAL));
if (handler == null) {
throw new FileOperationException("No available file handlers to operate the file").setErrorData(type);
}
return handler;
}

Как видите, после изменения было сохранено много кода. И общая временная сложность тоже отсокращено до.


Примечания

До этого мне всегда нравился GitHub, и я думал о том, чтобы внести свой код. Но, ограниченные возможностями и энергией, было представлено всего несколько вопросов: во-первых, используемые продукты с открытым исходным кодом относительно полны, а во-вторых, исходный код некоторых модулей не изучен глубоко.

На самом деле, в этот раз я специально не изучал весь исходный код ореола, просто из-за собственной доработки (планируя написать сильно настраиваемый персональный сетевой диск) я пошел сослаться на реализацию вспомогательного модуля ореола и модуля кеша. Позже, когда я скопировал его, я обнаружил, что эту часть можно оптимизировать, поэтому я отправил его.pull requestидея. Лично у меня всегда была тяга к миру с открытым исходным кодом, начиная с durid, используемого в моем классе на втором курсе, пока я не узнал позжеLombok,fFastjson,Spring,MyBatisЭти превосходные продукты с открытым исходным кодом. Точно так же, как в детстве я мечтал о реках и озерах, теперь у меня есть мечта и об открытом исходном коде.


Я очень рад, что у меня есть возможность написать несколько десятков строк кода для Halo.

Я надеюсь, что каждый может сделать все возможное, чтобы внести свой вклад в мир открытого исходного кода~

В этой статье используетсяmdniceнабор текста