1. 程式人生 > >模組化之路(cocoPod VS framework)

模組化之路(cocoPod VS framework)

模組化之路(實驗)

一直以來,我們都在嘗試讓程式碼儘可能高內聚、低耦合。比如我們將MVP框架改成MVVM框架,以解決Controller層程式碼臃腫不堪,讓model和view儘可能不要耦合。再比如,我們之前嘗試的路由,是為了讓Controller與Controller之間不要有太多的程式碼交集。而模組化實際上就是為了讓模組與模組直接相對獨立。

模組化優勢: 各模組程式碼與資源獨立使用與維護、獨立測試、各模組業務需求利於使用與維護、加快二次啟動速度(使用framework的前提下)

cocoapod 私有庫實踐

cocopod 是一個第三方庫依賴工具

要完成一個pod私有化全過程,需要三個倉庫(主專案倉庫、pod庫倉庫、PodDemo專案倉庫)、兩個專案(主專案、PodDemo專案)

1、在repo下建立私有庫(要遠端倉庫)

cd到cocoapods目錄下檢視本地的倉庫,會發現大概的檔案路徑是 ~/.cocoapods/repos/master … 這是系統中有使用到cocoapod後,在install pod的時候,會從cocoapod官網下載一份所有的庫的podspec檔案集合。這些都是共有庫的資源。所有專案需要使用pod庫的時候會在這裡索引,如果search不到,那就需要更新一下你的本地索引了。

因此,建立私有庫也是相同道理,就是在repos下建立一個類似master的私有的索引庫。所以,首先去個人的遠端倉庫(比如gitlab)建立一個git倉庫。比如是git地址是:

https://[email protected]/xx/BTCore.git

然後使用pod命令在Terminal執行:

$pod repo add BTCore https://[email protected]/xx/BTCore.git

執行成功後,就可以在 ~/.cocoapods/repos/目錄下看到BTCore檔案夾了。這個就是私有pod庫最終的索引。如果和同事合作的話,也同樣執行命令創建出一個repo即可。

OK,這一步就是順便完成了上面提到的pod庫倉庫。暫且擱置一旁!

2、建立一個新的PodDemo(要遠端倉庫)

PodDemo就是講程式碼打包成pod庫工具,另外它本身是一個完整的測試pod庫的專案。在將程式碼打包的前提需要先程式碼編譯通過,所以可以在demo裡盡情除錯。

使用pod命令建立一個標準的podDemo專案

$pod lib create BTCoreDemo

建立過程中會提示一些問題,類似:

What platform do you want to use?? [iOS/macOS]
What language do you want to use?/ [Swift/ObjC]
Would you like to include a demo application with your library? [Yes/No]
...

完成後就會生成一個專案

創建出來的專案的檔案結構會包含Example和Pod部分。類似:

BTCoreDemo
|——_pods.xcodeproj
|——BTCoreDemo
| |——Assets //放需要pod裡的資原始檔
| |——Classes //放pod庫程式碼檔案
|
|——Example //存放完整的專案檔案(除pod庫之外)
| |——BTCoreDemo //程式碼檔案,比如使用pod庫的檔案
| |——BTCoreDemo.xcodeproj
| |——BTCoreDemo.xcworkspace
| |——Podfile //庫使用到的第三方
| |——Podlock
| |——Pods //依賴的第三方
| |——Tests
|
|——BTCoreDemo.podspec //最重要的pod配置檔案

3、將程式碼移到Demo中,編譯成功後,update編譯成pod庫,並及時將程式碼更新到遠端倉庫,注意設定tag

接下來將解耦後的獨立程式碼放到Classes檔案中

cd 到Example目錄下, 執行

$pod update //完成後會將class裡的東西打包成pod庫

完成之後,用xcode開啟工程,會在pods工程下看到Development Pods檔案,這裡的BTClassDemo就是之後使用的最終的pod庫的內容。

但是不是將程式碼移過來就完成了,首先需要驗證pod庫,而這第一步就是保證當前Demo工程編譯通過。

4、配置podspec(最重要)

在編譯通過的前提下,就可以對pod進行一些定製化的操作。

Pod::Spec.new do |s|
s.name = 'BTCoreDemo' #庫名稱
s.version = '0.0.1' #version要和git上的tag進行對應
s.summary = 'BT學院App中基礎檔案、公共檔案、第三方庫等整合框架庫'
s.description = <<-DESC
'BT學院App中基礎檔案、公共檔案、第三方庫等整合框架庫,gogogogo'
DESC
s.homepage = 'https://[email protected]/caifan/BTCoreDemo' #隨便一網址
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'caifan' => '[email protected]' }
s.source = { :git => 'https://[email protected]/caifan/BTCoreDemo.git', :tag => '0.0.1' } #git地址,當前demo的git地址,tag則要和上面的version一樣

s.platform = :ios,'9.0' #平臺就iOS版本

s.requires_arc = true #是否支援arc

s.prefix_header_file = 'BTCoreDemo/Classes/prefixHeader.h' #pch標頭檔案,注意:寫完prefixHeader.h後,要執行pod update,成功後才會將prefixHeader.h檔案的內容copy一份到Support Files下的.pch中。否則專案中使用不了
s.frameworks = 'UIKit', 'AVFoundation','QuartzCore' #對外依賴的庫

#subspec: 建立子分支,每個子分支對應一層資料夾,注意:雖然在當前Demo中pod庫看似有檔案層次,但是當最終生成pod庫之後,只會存在子分支的檔案層次,各子分支裡的所有檔案都會被拍扁成一個層級檔案
#source_files: 子分支的檔案路徑,這裡有時候會出現找不到檔案的情況,所以要實時更新,多個檔案用,分割開,**/*表示子資料夾下所有的檔案和資料夾
#public_header_files: 子分支的標頭檔案路徑。
#dependency: 依賴,子分支之間的依賴、對第三方的依賴
#resource: 資源路徑

s.subspec 'Kit' do |kit|
kit.source_files = 'BTCoreDemo/Classes/Kit/**/*',
kit.public_header_files = 'BTCoreDemo/Classes/Kit/**/*.h'
kit.dependency 'BTCoreDemo/ThirdParty'
end

s.subspec 'ThirdParty' do |thirdparty|
thirdparty.source_files = 'BTCoreDemo/Classes/ThirdParty/**/*'
thirdparty.public_header_files = 'BTCoreDemo/Classes/ThirdParty/**/*.h'
thirdparty.resource = 'BTCoreDemo/Assets/SVProgressHUD.bundle'
end

s.dependency 'Masonry', '~> 1.0.2'

end

注意,每次完成後,需要直接pod update,這樣pod裡的檔案才會重新整理更新。

然後給podspec打上tag。注意tag必須和version一致

$cd .. //這裡是從Example資料夾退到上一層,含有podspec檔案的層級
$git tag 0.0.1
$git push --tag

最後,進行驗證:

$pod lib lint

如果要忽略警告,加上—allow-warnings,如果使用了第三方庫,則加上—use-libraries。

如果驗證不通過的話,是沒法push到repos裡的。

而驗證通過的前提就是不能有任何error。(這才是整個專案最蛋疼的地方)

5、將編譯驗證完成的podspec庫push到第一步建立的repo私有庫中(完成後會看到私有庫的遠端倉庫也會有一份podspec),在podspec檔案層級下進行

$pod repo push BTCoreDemo BTCoreDemo.podspec --allow-warnings

執行完這句後,會在第一步建立的BTCoreDemo下多出一個資料夾,資料夾下是對應版本的podspec。同時第一步建立的遠端的git倉庫也會多出這些檔案。

至此,說明pod庫是可用的了。

6、檢測是否能search到私有庫

$pod search BTCoreDemo

如果搜尋不到就先執行:

$rm ~/Library/Caches/CocoaPods/search_index.json

7、將pod成功的私有庫新增到原來的專案中

編譯原來專案的Podfile,將BTCoreDemo新增進去。

注意,podfile中需要把共有和私有的兩個地址都加上。

source 'https://github.com/CocoaPods/Specs.git' # 官方庫
source 'https://[email protected]/xx/BTCore.git' #私有庫

8、碼過留坑

這裡整理一下遇到的問題及解決的方案:

1、pod lib lint 中碰到的各種error和warn

ERROR | [iOS] file patterns: The resource_bundles pattern for SVProgressHUD did not match any file.

分析:目前總結出現這個問題的原因一般為:1、沒有打tag;2、tag與version不一致;3、各種路徑錯誤(這個有可能是它本身會抽,有時候提示路徑問題,但是改完倒騰回來就又有用了,也可能是沒有掌握到精髓)

—allow-warnings 忽略警告的驗證過程

2、資原始檔問題bundle

resource和resource_bundles的差異,參考簡書

3、subspec分支問題、資料夾問題

目前所知資料夾是沒法做層級的,只有分子分支,每個子分支會是一個資料夾。

4、swift混編問題

無論swift檔案在哪裡,使用#import 匯入swift橋接檔案
這裡的XX指的是pod包的名稱,其次要注意的是swift類應該用@objc標註宣告

5、編譯不通過

Returned an unsuccessful exit code. You can use --verbose for more information.
打成pod包的前提就是編譯一定要通過,所以這個沒有捷徑可走

6、庫迴圈依賴問題

There is a circular dependency between BTCore/ThirdParty and BTCore/Kit

出現這個問題的原因是由於pod庫裡面有子分支,每個子分支也是一個單獨的pod庫,所以分支之間檔案的引用如果不要pch的話,就需要使用dependency做依賴。因為子分支有可能會有相互引用到對方檔案的問題,所以如果使用dependency,就有可能會相互依賴的問題,最後導致circular dependency。

目前的解決問題就是子分支也解耦。如果子分支無法解耦,那就使用pch全域性引入需要用到的檔案。不過這也導致一個問題,那就是子分支就沒法單獨做pod使用了。所以最好的解決方案是解耦。

7、pch使用

語法: prefix_header_file: 預編譯標頭檔案路徑,將該檔案的內容插入到Pod的pch檔案內
1:ERROR | [iOS] unknown: Encountered an unknown error (No such file or directory @ rb_sysopen - /private/var/folders/n2/0fyx87s539j43pqj65tnwccc0000gn/T/CocoaPods-Lint-20180829-11315-7jhkz-BTCore/Pods/BTCore/BTCore/Classes/prefixHeader.pch) during validation.

目前得出的結論,pch除了能在PodDemo中使用,在pod庫中,完全就是絆腳石般的存在

8、壓死駱駝的最後一根稻草

xcodebuild: Returned an unsuccessful exit code. You can use --verbose for more information.

無解!!!

初步估計是因為pch的問題。查看了很多第三方pod,發現壓根不使用pch這玩意。而且每次error後的note也都是提示pch裡的import檔案not found。

所以,首先。準備好子分支之間的拆分。不能出現迴圈依賴的問題,不能相互import,總之pch沒有作用。

掉進坑裡,掙扎出不來了!!

pod lib lint —allow-warnings 忽略警告的驗證過程

pod repo push mySpec myLibrary.podspec —allow-warnings

9、pod存在的問題:

1、資料夾問題

pod暴露的東西只存在public_header_files中,而且目前沒有找到資料夾區分層次關係的問題。

2、生成的pod與實際能夠使用的pod有區別

生成的pod在demo中和實際驗證之後pod update下來的pod檔案層次是不一樣的,感覺非常不友好。而且及時生成了pod,驗證也存在很多問題,且問題難以定位。

cocoa touch framework實踐

1、什麼是動態庫

庫Library是一段編譯好的二進位制檔案,如果想自己的實現程式碼不暴露給別人,就可以使用庫的形式進行封裝,編譯的時候只需要link就好。連結又存在靜態連結和動態連結兩種方式,於是便產生了靜態庫和動態庫。

靜態庫即.a檔案(windows的lib),靜態庫編譯的時候會將二進位制檔案直接copy進目標程式中,之後將隨著一起載入,所以也就導致目標檔案太大的問題。

動態庫則是.tab、.dylib檔案,與動態庫不同的是編譯的時候不會被copy,而是隻在目標檔案中存一份動態庫的引用。它不會導致體積問題,但是動態載入的時候也會導致一些效能損耗。

Framework是一直打包方式,它將二進位制檔案、標頭檔案、資原始檔打包到一起。

2、建立自己的framework

1、建立framework

開啟xcode 選擇建立 cocoa touch framework 就可以了。
這裡有幾點注意:

  • 建立動態庫需要去setting中將mach-Type改成Dynamic Library
  • 如果要引入其他的framework,需要去setting中將Allow non-modular includes in Framework Modules 改成YES。
  • 如果有使用swift,需要去設定好swift的版本
  • framework不允許存在其他的framework
  • 如果是Swift&OC混編的framework,則要把swift中使用到的OC標頭檔案在Header中放到public中,因為framework不支援bridge
  • 將要對外的標頭檔案也放到Header的public中
  • 把需要新增的依賴庫加上,尤其是使用了第三方,比如wechatsdk的
  • 把需要對外暴露的標頭檔案在xx.h裡暴露出來,否則會有警告


2、使用framework

  • 將framework拖進來後,將framework copy一份。確保Embedded Binaries存在你的framework
  • 如果framework中有swift檔案而當前工程還沒有swift檔案,則需要先建立一個swift bridge。
  • 將原來framework依賴到的第三方也要pod進來

3、framework使用其他第三方framework

  • 蘋果禁止在Dynamic Framework中使用Framework。比如alipay。而pod的framework也只是將引用打包進去。所以這種依賴要在自己的framework的readme中註釋清楚。

4、給framework新增armv7s架構

模擬器對應的核心框架中,32位處理器對應的是i386,64位處理器對應的是x86_64

真機核心情況如下:

armv7: iPhone4 以下機型、iPad mini、iPod、iPad3以下

armv7s: iPhone5、iPhone5C、iPad4

arm64: iPhone5s以上、iPad air、iPad mini2

在Architectures新增完armv7s後,一直報error: Invalid bitcode signature ; clang: error: linker command failed with exit code 1 (use -v to see invocation)。

解決的步驟就是:將DeviceData刪掉,然後給所有pod導進來的framework新增上armv7s。重新編譯就OK了。

3、整合framework,將模擬器和真機的debug、release包整合到一起

首先將每一次build都只有一個包產生。而要產生release和debug包得分別在release和debug下進行編譯,這樣在Debug-iphoneos下兩個資料夾才有對應的包。然後在將Build Active Architecture Only設定成NO(包括pod庫裡的target),這樣才能在切換真機與模擬器的同時編譯出對應的iphoneos和iphonesimulator包

使用 命令列打包

//檢視包的核心架構有哪些:
$lipo -info /Users/fengcaifan/Library/Developer/Xcode/DerivedData/BTCore-foehvkpuvmgklxekqrhynchxldkr/Build/Products/Release-iphoneos/BTCore.framework/BTCore
// armv7 armv7s arm64
//將Debug環境下的真機和模擬器一同打包:
$cd 到包目錄

$lipo -create Debug-iphoneos/BTCore.framework/BTCore Debug-iphonesimulator/BTCore.framework/BTCore -output BTCoreDebugFramework //結束後會產生一個包

$lipo -info BTCoreDebugFramework //檢視包內容 Architectures in the fat file: BTCoreDebugFramework are: i386 x86_64 armv7 armv7s arm64

//這裡執行完是整合出一個可執行檔案,還並不是.framework。所以只需將這個可執行檔案將上述任意framework裡的可執行檔案替換掉就可以使用了。
  • 這裡碰到一個問題,使用cocoapod的庫,使用Aggregate 指令碼打包一直報swift找不到pod庫。

4、framework結合cocoapod的實踐

framework中使用cocoapod是將需要依賴的第三方庫以pod的形式匯入進來。但是要注意的一點就是framework如果是swift專案或者儲存swift混編,則需要將pod庫打包成framework。

5、framework結合carthage的實踐

carthage和cocoapod一樣是一個三方庫管理工具, carthage和cocoapod的區別 。因為carthage只生成framework,所以更符合我們這種混編的framework的需求。因為它目前流行於swift第三方庫中,對於一些老的OC庫還不支援,比如Masonry。所以這裡按自己需求使用。

6、上線之前,最好將framework進行拆包,只上傳Release真機包到app store。

拆包,將需要的架構拆出來,整合成新的架構

$ lipo BTCore -thin armv7 -output BTCoreV7 //將BTCore中armv7架構拆出來,生成一個叫BTCoreV7可執行檔案
$ lipo BTCore -thin arm64 -output BTCore64 //將BTCore中arm64架構拆出來,生成一個叫BTCore64可執行檔案
$ lipo -create BTCoreV7 BTCore64 -output BTCoreV764 //將BTCoreV7 BTCore64整合成一個新的BTCoreV764

7、碼過留坑

1、framework中OC與Swift類的相互呼叫(無法使用bridging導致的鍋)

因為framework無法使用bridging,所以swift中使用到的OC的類,必須得放到public中。然後在xx.h (xx是專案名稱)中按說明的格式import進來

2、framework裡的swift使用pod裡的OC類(無法使用bridging導致的鍋)

因為framework無法使用bridging,所以pod裡的oc類無法通過上述方式匯入,而應該通過將第三方pod生成framework匯入,即在podfile中新增 use_framework!。但是要注意的是,此時生成的framework在xcode中還顯示紅色,得把mach-type和Allow non-modular..設定好,build之後才能在pod資料夾找到framework。

3、dyld: Library not loaded: @rpath/libswiftCore.dylib (Demo裡沒有swift bridge導致的鍋)

說明framework裡有swift類,但是demo中沒有建立swift bridge。所以去建立一個就好了

4、Reason: image not found

embedded沒有framework導致的。

5、無法使用framework裡的類(request改成optional導致的鍋)

實際上,request是不允許改成optional的,否則執行時是沒法使用framework裡的類,正確的做法就是去檢視framework的allow non_module是否配置成功。然後確保demo中embedded中是否存在自己的framework。

6、framework中使用到的資源問題

framework中使用到的資源,最好應該單獨建立一個bundle,讓bundle和framework分離,但是這樣子使用的時候必須表明屬於哪個bundle會恨蛋疼。否則就是資源還是放在main bundle裡,不過這個獨立demo就沒法使用資源了。檢視 framework關於資源的讀取

7、framework存在的問題

  • 因為framework只暴露了標頭檔案,所以沒法對其進行除錯。這會是一個很蛋疼的問題
  • 如果要達到framework最大優勢化,應該給每個framework建立單獨的測試和除錯Demo
  • 每個子模組也應該有對應的環境設定、登入資訊等模組
  • 如果不能自動打包,收到打包會恨繁瑣,最好要有對應的工具鏈

專案處理



(卓明設計)

資料夾隔離

老的專案我們大多數是按單個小業務或者頁面分資料夾,然後分成M、V、C。而模組化我們需要做如下幾件事:

  • 在就要求原來的基礎上之上套一層模組資料夾;
  • 將每一個模組除M、V、C之外的api、對外依賴、資原始檔、巨集也都分離出來;
  • 將各個模組共享的檔案、資源、巨集整合到一起,沉澱到基礎庫裡
  • 模組間使用路由進行通訊。controller之間儘量不依賴,相互通訊儘可能走路由。通訊之間儘可能減少資訊流的傳遞

抽出基礎庫

在我們專案裡,我們稱之為BTCore。
可以看一下目前我們的BTCore有哪些東西:

Base         自定義basenavigation basecontroller等
Macro      巨集定義 + 協議
ThirdParty 經過用原始碼匯入的第三方 SDK
Kit         公用View + 所有工具類
Api api模組

豆瓣模組化

相關推薦

模組cocoPod VS framework

模組化之路(實驗) 一直以來,我們都在嘗試讓程式碼儘可能高內聚、低耦合。比如我們將MVP框架改成MVVM框架,以解決Controller層程式碼臃腫不堪,讓model和view儘可能不要耦合。再比如,我們之前嘗試的路由,是為了讓Controller與Controller之間不要有太多的程式碼交集。而模組化

iOS元件、外掛模組

前言:公司一年多的小專案,進行專案拆分,要求是每個業務模組都可以單獨打包。在開發過程中,如:酒店模組,只修改酒店單元,測試也只測試酒店部分。模組間相互不干擾,就有了,今天元件化之路。 一、元件化的目的。 說是元件化,其實更多的是模組化,對模組之間相互之間不干

ESP8266 WIFI模組學習1——模組的USB串列埠連線

ESP8266 WIFI模組是我一直想學習的模組,現在物聯網發展如此之快。 我們先看看ESP8266 WIFI模組長什麼樣子吧,如下圖: 然後,我們還需要一個TTL-USB串列埠線,如圖: 還需要一個串列埠除錯助手,為了接發資料。我使用的除錯助手如下圖:

ESP8266 WIFI模組學習2——模組與微控制器連線進行遠端操作

上一個部落格:ESP8266 WIFI模組學習之路(1)是關於對串列埠連線的,簡單驗證ESP8266是怎麼樣連線及其功能驗證,下面將通過微控制器連線,和手機進行遠端操作。 ESP8266和微控制器的連線,我這裡的微控制器型號為:STC12C5A60S2 ESP8266

ESP8266 WIFI模組學習7——自寫Android手機APP接受微控制器資料

上一篇是寫關於自寫Android手機APP給微控制器下發資料的,這次我將寫一下APP如何接受微控制器資料。 其實使用除錯助手,或者別人開的的APP同樣能夠實現接受微控制器資料,但想學習的,我還是建議能夠自己寫一個Android軟體,這樣從底層到上層都能學到很多東西。 AP

Android Api Demos登頂四十五Loader--&gt;Cursor

adapt lists 清空 function icon 創建 nal pat lines 這個demo演示了類載入器的用法。關於類載入器的使用我們在前面的demo中已經介紹過了 在此再小小的復習一下。類載入器的使用步驟: * 1.獲取類載入

OpenCV探索二十六:如何去除票據上的印章

com 票據 uid amp 去除 album 探索 ace 十六 http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1338281http://pic.cnhubei.com/space.php?u

前端基於react,後端基於.net core2.0的開發番外篇 後端使用T4模板,生成某些類

bsp 。。 bubuko 按鈕 uil out eva 下載地址 所有 1.介紹 因為開發過程中,有部分類是你加一個模型,就需要去改動的,每次加非常的煩,或者有些類,你只用到了他基類的方法,但是你還必須建一個文件才能調用他基類的方法,也很煩。 這個時候,T4就非常有用了。

Spark學習 二十八分布式圖計算系統

尺度 內存 底層 mapr 分區 ces 兩個 傳遞方式 cat 一、引言   在了解GraphX之前,需要先了解關於通用的分布式圖計算框架的兩個常見問題:圖存儲模式和圖計算模式。 二、圖存儲模式   巨型圖的存儲總體上有邊分割和點分割兩種存儲方式。2013年,Gra

免費公開課-零基礎小白如何開始自己的Python運維王進老師

amp 趨勢 公開 開發 視頻 選擇 lock .com 系列 講師主頁:http://edu.51cto.com/lecturer/7787419.html【王進老師】微軟認證金牌講師,資深微軟技術專家,微軟售前顧問。長達七年的微軟授課經驗和項目經驗,在課程中融入豐富的企

python小白基礎知識一

邏輯運算 () 字母 日常 utf-8 orm 之路 命名 修改 一、開篇輸出:print("Hello World!") 二、中文自由行:#coding=utf-8 或 # -- coding:UTF-8 -- 三、Linux多行:#!/u

python小白控制語句二

結束 語句 for break 多個 判斷 嵌套 循環語句 遍歷 1、判斷語句:往往用來對是否滿足條件進行判斷。if、if...else...、if...elif...else...、if嵌套。 2、循環語句while:一般通過數值是否滿足循環條件。for:一般是對能保存多

Python三十二:DjangoModel補充 DjangoModel進階的更多操作 DjangoModel進階的更多操作

Django之Model進階的更多操作   一、欄位 AutoField(Field) - int自增列,必須填入引數 primary_key=True BigAutoField(

十面阿里 屌絲程式設計師的逆襲文末獻禮

前言 《十面阿里》本屌現今四年開發經驗;前前後後為進阿里面試十次(阿里旗下——螞蟻金服,天貓的offer都被hr因學歷而被拒,最後的菜鳥面幸運的被錄用,拿到P6offer,真正的“十面”阿里!)。 本文前半部分主要分享面試總結,後半部分分享程式設計師我個人架構開發之路的學習經驗。

Python小白學習二十一—【迭代器】

迭代器 1.迭代器協議 物件必須提供一個 next 方法,執行該方法要麼返回迭代中的下一項,要麼就引起一個Stoplteration異常,以終止迭代(只能往後走不能往前退) 2.可迭代物件 實現了迭代器協議的物件(如何實現:物件內部定義一個_iter_()方法) 協議是一種約定,可迭代物件實現了

阿里P7架構師必修年薪60萬

阿里巴巴,是多少從事IT事業的程式設計師夢寐以求的地方,能進入這樣大廠的程式設計師可以說都是數一數二的人才。 最近有不少朋友問,成為阿里P7Java架構師需要系統學習哪些Java技術。 下面分享網際網路Java技術體系圖(圖片可以儲存) 一、構成架構師的技能體系  

Python小白學習二十二—【生成器】

表達式 視頻 控制 del 循環 有道 cor 數據量 分享圖片 一.什麽是生成器? 生成器可以理解成是一種數據類型,特殊地是生成器可以自動實現叠代器協議其他的數據類型需要調用自己內置的__iter__方法所以換種說法,生成器就是可叠代對象 !回憶:很重要的叠代器協議

LeetCode刷題第三天

10. 正則表示式匹配 給定一個字串 (s) 和一個字元模式 §。實現支援 ‘.’ 和 ‘*’ 的正則表示式匹配。 ‘.’ 匹配任意單個字元。 ‘*’ 匹配零個或多個前面的元素。 匹配應該覆蓋整個字串 (s) ,而不是部分字串。 說明: s 可能為空,且只包含

Python小白學習二十四—【裝飾器】

裝飾器 一、裝飾器的本質 裝飾器的本質就是函式,功能就是為其他函式新增附加功能。 利用裝飾器給其他函式新增附加功能時的原則:         1.不能修改被修飾函式的原始碼        2.不能修改被修飾函式的呼叫方式

篤志前行——一個四非一本院校計算機學子保研最後確定復旦

之前看了許許多多保研經驗帖,如今我也寫下這篇文章,希望幫助到各位學弟學妹們。 曾經的我是想出國的,但是有位學長(真的很感激他,幫了我很大忙)和我說復旦希望很大,因此在大三上就決定走保研這條路了。 不過呢,我還是建議大家可以去美國還是去美國吧,我是因為從小就特別憧憬復旦,所以