Давно не писал статьи, и заголовок немного раздулся.
Угадай, что я пытаюсь сказать
Я хочу написать короткую заметку о парном программировании. недавно сS
(Красивое имя цветка) В свободное время я занимался парным программированием. Теперь я собираюсь поделиться с вами некоторыми мыслями о парном программировании, так что давайте начнем.
PS:
Эта статья, не вдаваясь в детали, сосредоточится на общих выводах, надеясь быть полезной для всех вас.
Почему в новую эру это называется парным программированием?
Здесь я объясню, почему, пожалуйста, прочитайте ниже.
традиционное парное программирование
Определение Википедии выглядит следующим образом:
Парное программирование — это метод гибкой разработки программного обеспечения, при котором два программиста работают вместе на компьютере. Один человек вводит код, а другой просматривает каждую строку кода, которую он вводит. Человек, который вводит код, называется водителем, а человек, который просматривает код, называется наблюдателем (или навигатором). Два программиста часто меняются ролями. При парном программировании наблюдатели одновременно рассматривают стратегическое направление работы, предлагая улучшения или проблемы, которые могут возникнуть в будущем для решения. Это позволяет водителю полностью сконцентрироваться на «тактических» аспектах стоящей перед ним задачи. Наблюдатели служат страховочными сетками и проводниками. Парное программирование имеет много преимуществ для разработки программ. Например, повышение дисциплины, написание лучшего кода и т. д. Парное программирование является частью экстремального программирования.
Почему я считаю его устаревшим?Послушайте меня вкратце(ху) проанализируйте(пост):
Два человека делят компьютер, что может бытьACM
соревнование или командаPK
общий в. Но для развития бизнеса это немного ненаучно, и во-первых, эффективность невысока: если код собеседника слишком милый, он может не устоять и не ударить его. Конечно, он будет появляться и в особых ситуациях, но95%
В сценарии невозможно иметь сценарий, показанный ниже.
Следующая сцена похожа на летящий снег в июне:
Тем не менее, этот сценарий более чем счастлив принять:
Конечно, не спрашивайте меня, почему, потому что:
Итак, что я думаю о парном программировании новой эры?
Парное программирование для новой эры
Я думаю, парное программирование в новую эпоху должно быть таким:
два(N
) индивидуальныйcoder
, два(N
) комп, посидим вместе (впоследствии может и не надо будет сидеть вместе) для развития. Коды могут видеть друг друга. Наиболее важным моментом является то, что мы можем видеть друг друга и понимать код друг друга.
Что такое сознание?Приведу пример:
я иS
прийти к мнению,S
Быть ответственным заnode
, то есть back-end, я отвечаю за front-end, а front-end и back-end разделены. Тогда мы можем видеть код друг друга, и мы все знаем, какую функцию разрабатывать, я могуreview
S
код,S
также можетreview
мой код. При разработке я могу пройтиreview
S
код, знай заранееS
логика интерфейса. Если я решу, что у него проблемы с написанием логики, я свяжусь с ним и заранее разберусь с возможными сомнениями. Так же зарезервирую логическую обработку запроса по заранее написанному им интерфейсу. Короче, в парном программировании я так понимаю. Это должна быть одна и та же способность, один и тот же код через друг друга.review
Код функции другой стороны, чтобы сравнить их собственный код. Таким образом, другая сторона может быть проинформирована о возможных проблемах, и решение таких проблем значительно повысит эффективность разработки и решит некоторые потенциальные проблемы раньше.
PS:Конечно, этот новый метод требует определенной технической базы, например, вы должны уметь понимать внутренний код. Ну, если это
Java
, вам может быть труднее. Конечно, он также будет жестче. Так ещеnode
Дафа хороший, руки веселые. Короче говоря, это то, что я считаю парным программированием в новую эпоху, оно не универсально, и, конечно, преимущества этой формы очевидны.
Запой перед парным программированием?
Эм? По традиции, конечно же, проводится предспаривание. пошел туда1912
, хорошо поели и наслаждались японским обслуживанием. Тогда идите в кафе, чтобы начатьface to face talking
, вот-вот начнется счастливое парное программирование.
Как играть с цветами?
Я разделил его на две части, чтобы представить, первая часть — это передняя часть, а вторая часть — задняя часть.
внешний интерфейс
Выбор технической архитектуры
В первую очередь подбор каркаса, после замеров выбор.Vue
. Здесь у меня нет мнения о том, какой фреймворк использовать, единственное мнение:
Согласно реальной ситуации, чтобы выбрать соответствующую структуру развития, тем самым повышая общую эффективность развития.
Независимо от того, использовать ли строительные леса, я также придерживаюсь приведенного выше предложения и делаю соответствующий выбор в соответствии с реальной ситуацией. Здесь я выбираюVue-cli3
для быстрого создания приложений. Как его использовать, вы узнаете, изучив его самостоятельно.
Здесь можно указать несколько путей
Первый путь: перейти кcli.vuejs.org/Исследование официального сайта
Второй путь: иди и смотриvue-cli3
Исходный код , чтобы понять некоторые внутренние механизмы, такие какchainWebpack
реализация,vue.config.js
Как реализованы настройки по умолчанию.
Третий путь: перейти кgithub
найди немногоvue-cli3
построенный проект,clone
Сходите и изучите, как его используют другие.
PS:Лично я не считаю скаффолдинг технически сложным.Просто посмотрите документацию.Если не работает,идите к исходникам и возитесь с ним.Это почти то же самое.
Выбор стилевой схемы
После выбора технической основы давайте взглянем на выбор стилей, общая схема стилей и отраслевые стандарты в основном одинаковы. Но что касается того, где размещать стили в компонентах, в настоящее время в отрасли, вероятно, существует два типа.
Разделение каталогов стилей и компонентов
Каталоги стилей и компонентов разделены, что в настоящее время очень много.ui
Путь библиотеки.
Напримерiview
elementui
, я покажу вам скриншот.
как показано на рисункеiview
Скриншот:
Как видно из рисунка выше, все стили компонентов размещеныstyle
каталог и с помощьюless
.
Каталоги стилей и компонентов не разделены
Говоря об этом, нынешний представитель, вероятно,ant-design
.
как показано на рисункеant-design
Скриншот:
Мы можем видеть это вant-design
, стиль компонента помещается в директорию компонента, а также используетсяless
.
Какой стиль использовать для письма
Что касается того, какой стиль использовать. Для того, чтобы играть с цветами, я использую одновременно три стиля:scss
less
stylus
. В процессе я предпочитаюstylus
, потому что он похож наpython
Отступ простой и быстрый. В одном не нужно писать точку с запятой, во втором не нужно писать круглые скобки, а в третьем не нужно писать двоеточие. если ты виделvue-cli3
исходный код, вы найдетеui
раздел, стиль используетstylus
.
vue-cli3
в исходном кодеui
Деталь показана на рисунке:
Суммировать
Что касается выбора стилевой схемы, то я хочу выразить следующее:
Что касается стиля обработки компонентов, в отрасли существует два стандарта, нет хороших или плохих, но нам нужно знать эти стандарты, и, зная эти стандарты, мы можем предоставить некоторые рекомендации и помощь в нашей собственной практике.
Я использую:
Схема, в которой стили и каталоги компонентов не разделены, при этом для написания стилей используются три стиля.stylus
.
Об управлении состоянием
В отрасли много государственного управления,vuex
,redux
,mobx
,dva
и т.п. Цель ясна:Инкапсулируйте хаос с помощью абстракции.
Для себя я подумаю над вопросом, действительно ли этот проект нуждается
vuex
, для того, чтобы поиграть с цветами, обработка, которую я сделал, это:
Отрежьте две ветки, одна не используетсяvuex
, используетсяvuex
.
когда использовать
vuex
Когда компоненту нужно поделиться некоторыми данными, а данных много, его можно использоватьvuex
. Если данные не нуждаются в совместном использовании или их меньше, нет необходимости использоватьvuex
.
Две формы vuex
использоватьvuex
Когда не так много состояний, которыми нужно управлять, их можно напрямую записать в файл. Если есть много состояний, которые необходимо обработать, используйтеmodule
письма. Классифицируйте состояния по разнымmodule
.
Обработка запросов
Что касается запросов, то здесь я делаю максимально возможное извлечение части запроса и резервирую питы, которые могут появиться в будущем. Например, зарезервировать перехват запросов, зарезервировать для шифрования запросов, зарезервировать общедоступные параметры и зарезервировать ямы для смоделированных данных.
Обычно я делю эту часть логики на три категории. одинStateService
,одинApiService
,одинService
. Конечно, если сервисов слишком много, можноService
подразделять, напримерUploadService
,MonitorService
Ждать.
О данных моделирования
Когда дело доходит до смоделированных данных, вашей первой реакцией может быть использованиеeasy-mock
,использоватьrap
Ждать. Со своей стороны я выбрал практику, о которой мало кто знает, то есть симуляцию данных через декораторы.
Какое сознание? я кратко представлю
как показано на рисунке:
Как вы можете увидеть с картинки выше, яService
серединаgetuserinfo
Осуществляется перехват декорации, и в нее через декоратор вводятся смоделированные данные. Затем используйте оценку среды, чтобы убедиться, что этот метод декоратора не работает в производственной среде.
Хоть и будет пахнуть хакерским кодом, но после того, как вы его действительно попробуете, вы почувствуете всю прелесть использования декораторов для решения симуляции данных, ведь вы можете управлять всей логикой запросов как угодно. Чтобы добиться моделирования всего внешнего процесса, вообще не полагаясь на внутренний интерфейс.
Об инструментальном методе
Для этого нам нужно подумать о том, нужно ли этому проекту полагаться на некоторые библиотеки инструментов, такие какlodash
,ramda
. Если вы не полагаетесь на него, то напишите его изначально.
Инструментальные методы я тоже разделю на категории, разделю на внутренние методы и внешние методы. Если он предназначен только для использования другим методом и не будет подвергаться воздействию бизнеса, то я буду рассматривать его как внутренний метод.
О производительности
Это банальная вещь, и я вообще делю производительность на два аспекта.
Что могут сделать строительные леса
- Отдельные пакеты зависимостей от бизнес-кода
- правильно
js
css
и т.д. сжимать, это правильно?css
разделять - Сжать ли изображение, преобразовать ли маленькое изображение в
base64
- Решите, использовать ли его в зависимости от деловой ситуации
cdn
- третьим лицам
ui
Библиотеки для обработки производительности, такие как пост-компиляция - Общайтесь с серверной частью, чтобы решить, открывать ли
gzip
Что строительные леса не могут сделать
О сжатии изображений
несмотря на то чтоwebpack
Сжатие изображения есть, но судя по сравнению, качество и эффект от его сжатия все же неtinypng
Отлично, если вы не знаетеtinypng
, вы можете нажатьtinypng.com/провестиTP
.
tinypng
Алгоритм сжатия не является открытым исходным кодом, хотя его можно использовать бесплатно, но будут некоторые ограничения.github
был специально разработан компаниейtinypng for mac
. Маленькие партнеры сами в этом разберутся, инструмент все равно очень полезен. Вы можете заменить файл в исходном месте, и сжатое изображение практически не потеряется.
Повышение производительности на уровне кода
Это то, чего скаффолдинг не может сделать.Когда мы пишем код, мы должны обращать внимание на производительность кода. Например, сохранение данных в локальные переменные, оптимизация циклов, устранение дребезга функций, регулирование функций, отложенная загрузка изображений и т. д. Не буду говорить о спектакле, это слишком банально.
Об асинхронных ожиданиях и промисах
Я упомяну об этом. В проекте, как мы его используем гибкоasync await
а такжеpromise
, во-первых, чтобы быть ясным, его нельзя использовать ради использования. Здесь я высказываю свое личное мнение, вот несколько сценариев использования обоих.
- когда вы хотите использовать
try catch
При отлове исключений асинхронных операций - Когда вы хотите вложить асинхронное действие в другое асинхронное действие
- Когда вы хотите обернуть функцию как
promise
когда
Я просто привожу пример, следующий код:
fn(res => {
// TODO:
})
На картинке вышеfn
является асинхронной операцией, и в ней выполняется функция обратного вызова. Теперь есть два вопроса:
- Если мы хотим
fn
сталиpromise
Шерстяная ткань? - Что, если мы хотим продолжить выполнение других асинхронных операций в функции обратного вызова?
Ввиду двух вышеуказанных проблем, давайте решим их одну за другой.
Для решения первой проблемы:
Сначала ставим асинхронную операциюfn
сталиpromise
форма, очень простая.
Примерный код выглядит следующим образом:
function wrap() {
return new Promise((resolve, reject) => {
fn(res => {
resolve()
})
})
}
Для решения второй проблемы:
еслиfn
В функции обратного вызова также требуются асинхронные операции, так как же элегантно решить эту проблему? использовать это времяasync await
.
Примерный код выглядит следующим образом:
function wrap() {
return new Promise(async (resolve, reject) => {
try {
fn( async res => {
let result = await fn2()
})
}catch(err) {
// TODO:
}
})
}
Вы обнаружили, что код является синхронным и может использоватьсяtry catch
. Что ж, это так просто и естественно.
Об анимационных переходах
Мы знаем, что взаимодействие должно быть дружелюбным и не слишком жестким, а прыжок должен быть плавным. Поэтому на некоторых страницах используйтеgsap
, Для тех, кто не знает, можете проверить информацию.
Краткий код выглядит следующим образом:
// 只用到了 TweenLite 、TimelineLite 两个方法
import { TweenLite, TimelineLite } from 'gsap'
let tw = new TimelineLite()
tw.add(TweenLite.to(this.style.blocks[0], 0.5, { opacity: 1, delay: 0.5 }))
tw.add(TweenLite.to(this.style.blocks[2], 0.5, { opacity: 1 }), '-=0.3')
Плавность подключения достигается за счет настройки стиля.
О загрузочном компоненте
Мы развиваем WeChatH5
Тмолл ТаобаоH5
, при разработке быстрых приложений, разработке небольших программ и т.д.loading
Это произведение нужно сделать. Например, когда начинается запрос,loading
В начале пользователь не может выполнять другие операции, когда запрос заканчивается или является ненормальным,loading
конец.
Затем перед лицом третьего лица
ui
библиотека илиAPP
Когда мы приходим с реализацией, как мы выбираем, использовать ли готовую или написать ту, которая нам больше подходит?
Мое личное мнение - написать от руки то, что тебе подходит.loading
. Причина этого, которую я могу обобщить на высоком уровне, заключается в следующем:Унифицированный и гибкий.
PS:Конечно, это не абсолютно. Просто предложите идею, например, WeChatH5
, Торговый центрH5
, не используйте свои собственныеloading
, используя тот жеloading
компоненты.
Об эффекте начального экрана
Есть много способов открыть экран, например, с помощьюvue-touch
чтобы завершить операцию прокрутки вниз.
Общий эффект таковgif
картина:
После того, как это сделано, это не чувствует себя достаточно прохладно. Поэтому ее усовершенствовали, и была реализована вторая схема, использующая кадры последовательности для завершения спецэффектов открытия экрана.
Что такое кадр последовательности?
Кадры последовательности создаются путем разложения видео на кадр за кадром. затем пройтиcanvas
Он рисуется по определенному временному интервалу, чтобы пользователь чувствовал, что это серия картинок со спецэффектами. можно представить какPPT
эффект вспышки.
Поскольку вам нужны последовательные кадры, вам нужен индикатор загрузки. Индикатор выполнения может быть инкапсулирован в компонент.Идея состоит в том, чтобы установить процент в зависимости от хода загрузки данных и одновременно установить некоторые анимационные эффекты.
Общий эффект таковgif
картина:
Как видно из вышеизложенного, когдаgodkun: 源码终结者
Когда отображение завершено, т. е. индикатор выполнения достигает100%
когда. Указывает, что данные, требуемые кадром последовательности, загружены.
О композитинге изображений
Нужно обмениваться картинками, если передать на бэкенд, то нагрузка на бэкенд увеличится из-за большого количества картинок, которые нужно синтезировать. После консультации было решено синтезировать на переднем конце черезcanvas
будущее10
Картинка синтезируется в общую картинку, и здесь не так много моментов, на которые следует обращать внимание. Следует отметить, что на картинкеonload
Нарисуйте снова в обратном вызове события.
Примерный код выглядит следующим образом:
async drawCanvas() {
let canvas = this.$refs.myCanvas
canvas.width = xxx
canvas.height = xxx
let bg = await this.drawBg()
this.drawImage(bg) // 不变
// TODO: 绘制其他
let data = canvas.toDataURL('image/jpeg')
const params = {
base64: data
}
let result = await Server.getImage(params)
this.$refs.canvasImg.setAttribute('src', result)
}
PS:Здесь есть яма, ее нельзя сохранить на телефонах Android.
src
дляbase64
, пройдя через карьер, решил пройтиbase64
Данные отправляются на сервер, а затем возвращаютсяpng
адрес, чтобы решить эту яму.
О закопанных точках
Похороненная цель состоит в том, чтобы собрать все виды информации, напримерPV
,UV
, CTR, исключения. Итак, как сделать точку захоронения, общую переднюю точку захоронения, я думаю, нужно следовать двум пунктам:
Первый пункт: не перегружайте код, также известный как жесткое кодирование.
Второй момент: добиться многоразовости, то есть провести унифицированную инкапсуляцию
Например, переименуйте соответствующую скрытую точку, напримерb1
b2
b3
.
Грубый код выглядит следующим образом, просто и грубо:
burryDetail ={
b1: {
actionName: 'gotohome'
}
}
export default function burry(key) {
let burryObject = burryDetail[key]
// TODO: args
let argN = burryObject.actionName
send(...args, argN)
}
Преимущество этого в том, что все скрытые точки помещаются в один файл для централизованной обработки, а не прописываются напрямую в бизнес-коде, что способствует разделению. Для некоторых особых случаев, которые необходимо прописать в бизнес-коде, следует применять особый подход.
О режиме работы
Говоря о режимах работы, можно думать о режиме разработки, режиме производства и даже режиме анализа. Сейчас я вvue-cli3
, и настройте его в соответствии с предписанным методом. например новый.env.dev
.env.prd
.env.xxx
документ
следующим образом.env.dev
Код:
NODE_ENV = "development"
VUE_APP_BASE_URL = "xxxxxxxxxxxx"
затем вscripts
написать в
"dev": "vue-cli-service serve --mode dev",
ты можешь пройтиnpm run dev
запустить режим разработки.
О третьих лицахsdk
подсказки кода
Иногда вы обнаружите, что введениеsdk
После этого подсказки по коду нет. Затем я искал в Интернете и не смог найти официальное решение, что мне делать в это время?
Очевидно, что вы можете написать файл объявления только самостоятельно, вот для
VSCODE
Например, стандартный способ — создать каталог нового типа, а затем создать новыйsdk.d.ts
.
Код примерно такой:
declare namespace SDK {
function fn1(callback: () => void): void
function fn2(text: String): void
function fn3(): void
function fn4(
object: {
arg1: String
arg2: String
arg3: String
arg4: String
},
callback: (res: {}) => void
): void
}
этот кусок в соответствии с конкретнымSDK
Просто напишите нужную вам подсказку.
задняя часть
серверная частьS
написано, поэтому я получаюcode review
Поговорим об общем положении бэкенда в виде.
что делать в бэкенде
Есть примерно следующие моменты:
- записывать
API
интерфейс - написать фоновое управление
- Напишите другие вспомогательные функции
- База данных проектов
- xxxx...
Выбор бэкэнд-фреймворка
используется здесьegg.js
, который использует согласованную философию для быстрого создания приложений и повышения эффективности разработки.egg
Есть много учебных документов, пожалуйста, разместите адрес официального сайта:
Как писать интерфейсы
Об этом и говорить нечего.Он перехватывается роутингом и затем передается в соответствующую логическую обработку.Возможно, мидлвар нужно будет обрабатывать в середине.
Как централизованно обрабатывать ответы
Как лучше спроектировать возврат, практика здесь заключается в том, чтобы инкапсулировать возврат какplugin
, а затем расширить доcontext
начальство. Таким образом, вы можете пройтиctx.sendresult
Равномерно обрабатывать возвращаемый контент.
Использование промежуточного программного обеспечения
Чего не скажешь о промежуточном программном обеспечении, которое по сути является экспортируемой функцией. Он используется для обработки полученных данных и выполнения соответствующей обработки данных.
В основном есть два результата обработки данных:
- Первая концовка: перейти к следующему шагу
- Вторая концовка: в этом мидлваре
game over
Возьмите реальную сцену:
Например, наиболее распространенным является аутентификация. Мы можем управлять им в маршрутизации:
код показывает, как показано ниже:
router.post('/api/xxx', auth(), controller.xxx);
При обработке запроса на ограниченный интерфейс сначалаauth
Если обработка завершается неудачно, последующая логическая обработка прерывается, и непосредственно возвращается содержимое ответа, такое как отсутствие входа в систему или отсутствие авторизации.
узлаMVC
и передняя частьMV*
V
Здесь я кратко упомяну, что вnode
слой, так и на переднем уровне, которыйV
Все могут понять, все они осознают воззрение,node
слоя, но и для записи страниц, например, мы пишем404
страница с промежуточным программным обеспечением, которое обрабатывает исключения. Если промежуточное ПО ловит404
, затем вернитесь напрямую404
страницу на передний план.
C
C
В передней части это на самом деле самая разнообразная точка, поэтому я добавил*
Выражать.C
правильноnode
С точки зрения времени, время также является наиболее важной частью.Оно специально обрабатывает полученные запросы и распределяет их по каждому логическому центру обработки.Наконец, через серию обработок, а затем черезC
Слой возвращается на передний конец.
M
M
правильноnode
Это очень просто, при обработке логики вам нужно взаимодействовать с базой данных, чтобы добитьсяCRUD
Для реализации добавления, удаления и модификации данных.M
Для фронтенда тоже все очень просто, правильноV
данные слояCRUD
. передний и заднийM
Слои немного разные.
Подводя итог, задняя частьMVC
Кажется, что он более продвинутый, чем переднийMVC
Простой для понимания интерфейсMVC
Это как будто была насильно устроена волна.
Внешняя конфигурация и внутренняя конфигурация
Благодаря постоянному совершенствованию фронтенд-инжиниринга, конфигурация фронтенда и конфигурация бэкэнда в основном одинаковы, поэтому я не буду упоминать об этом здесь.
О базе данных
упоминалось выше, используйтеmysql
, конечно нравитсяegg-sequelize
mysql2
Все это используется. Определение модели обычно находится вmodel
В каталоге определите модель, а затем повесьте наApplication
вниз, черезapp.model.xxx
чтобы получить контекст соответствующей модели. Обработку модели обычно проводят вservice
Под содержанием.
О публичном пути
В большинстве случаев после того, как front-end проект упакован, он помещается в back-end.public
каталог, поэтому, когда вы увидите это, ваши друзья должны понять, что в инструменте сборкиpublicPath
Что это (вручную смешно).
Суммировать
Прочитав внутреннюю часть, вы обнаружили, что она тоже очень проста, весь кодjs
, Как написать бизнес-логику во внешнем интерфейсе и как написать бизнес-логику в бэкэнде.
Основное различие между ними заключается в том, что переднюю и заднюю части нужно рассматривать по-разному.
Серверная часть должна учитывать безопасность, учитывать нагрузку сервера, учитывать дизайн интерфейса и дизайн базы данных. Конечно, на высоком уровне также следует учитывать балансировку нагрузки, высокий параллелизм и т. д. Внешний интерфейс должен учитывать эстетику страницы, беглость страницы, удобство взаимодействия с пользователем, скорость открытия страницы и так далее. Словом, не всем легко, только держась за руку ребенка, мы можем состариться вместе с ребенком. (вручную смешно+2
)
Завершить сводку
После прочтения я чувствую, что это не имеет ничего общего с парным программированием?Я тоже почувствовал это после прочтения.
написал6000
Слово, что я представляю.
Шучу, шучу, на самом деле эта статья имеет сильную связь с парным программированием.Этот процесс - дело меня иS
завершены вместе.
Диаграмма ниже отражает весь процесс.
Ведь мы можем говорить не только о парном программировании, но и о других вещах.
Я думаю, что прелесть парного программирования в том, что вы можете:
Обратная связь друг с другом и внесение своевременных корректировок для совместного повышения эффективности разработки. Конечно, самое главное уметь задействовать (вы говорите) на основе (чего?)
Примечание
- Дополнительная часть от 1 мая, написанная немного наспех, чтобы зафиксировать недавний опыт парного программирования.
- Игра с цветами на самом деле может быть понята из текста, например, три набора стилей, два набора управления состоянием, декораторы для решения моделирования данных, кадры последовательности для решения открытия экрана, в реальном времени
review
Бэкенд-код, написание логики фронтенд-запросов в соответствии с бэкэнд-кодом и т. д. кажутся немного затратными. - Статья неизбежно неверна, пожалуйста, потерпите меня, добро пожаловать, чтобы указать на ошибки в комментариях и больше общаться
Ссылаться на
-
Мой собственный опыт парного программирования
-
@Когда выражение любви встречается с декоратором реальностиДобро пожаловать в публичный аккаунт WeChat этого крупного парня:Синьцзи Интерактив
Некоторые другие мои статьи из цикла
- Как писать качественные функции — сбить гору и встряхнуть тигра
- Как писать высококачественные функции — именование/комментарии/надежность
- Как писать высококачественные функции — открывая две вены Рена и Ду [Теория]
- Как писать качественные функции — откройте второй импульс Ren и Du [Actual Combat Volume]
общаться с
Серия технических статей Nuggets резюмируется следующим образом: если вы считаете, что это хорошо, нажмите на звездочку, чтобы поощрить это.
Я терминатор исходного кода, и обмен технической информацией приветствуется.
также может войтиГруппа звукозаписи Front-end RhapsodyПроведите мозговой штурм вместе. Если вы хотите добавить, потому что она заполнена, вы можете сначала добавить меня в друзья, и я приглашу вас присоединиться к группе.
Язык ветра
Завтра будет Первомай.Я поздравляю своих друзей с Первомаем.Меня не волнует ваше благополучие, я просто хочу, чтобы вы были счастливы!
Напоследок: уважайте оригинальность, самый богатый человек, укажите источник для перепечатки 😋