美文网首页iOS奇思怪巧iOS 技术文集面试宝典
iOS 项目的目录结构能看出你的开发经验

iOS 项目的目录结构能看出你的开发经验

作者: 汉斯哈哈哈 | 来源:发表于2015-08-18 16:40 被阅读44827次

    最近有师弟面试iOS开发,他很吃惊地跟我说,面试官竟然问他怎么分目录结构的,还具体问每个子目录的文件名。

    目录结构确实非常重要,面试官这么问他,无疑是想窥探他的开发经验。清晰的目录结构,可让人一眼明白相应的业务和职能,这也能体现开发者的经验和架构水平。

    目前,我接触过的项目中,比较常规的两种结构:
    1.主目录按照业务分类,内目录按照模块分类(主目录按照MVC架构分类,内部根据项目模块分类)

    优点:相对比较快定位对应的业务。
    缺点:模块相关类太过分散,需要来回切换寻找文件,不方便开发。

    2.主目录按照模块分类,内目录按照业务分类

    优点:对模块的类集中化,方便管理与开发。
    缺点:当几个模块共用一些类时,不太好归类。

    假设对简书iOS应用目录分类(非官方):

    • 1.主目录按照业务分类,内目录按照模块分类
    • 2.主目录按照模块分类,内目录按照业务分类

    注意: 以上�两种分类不是绝对的,具体还得按照业务需求去归类。如果公司多项目的话(指外包公司,哈~),可以尝试按照自己的逻辑去归类,或可以多观察下身边大牛搭建的项目,会吸取到其中的奥秘。代码也一样,多看看大神写的,甚至可以直接模仿大神的代码风格,别人也会把你当做大神!
    ps:有评论说,目录备注中文名感觉就lo了。确实开发中,一些非常有经验的程序员,不会这么干,甚至在代码中也很少中文注释。但个人觉得,普通或中高级工程师真滴很有必要多些注释,由于经验少,变量和方法名可能都命名不好,很多用googl翻译直译,甚至自己到审查代码时都不能直译出来。多谢注释好处就是就算你看不懂我写的代码,也一定能让你知道这是干什么滴(万不得己时,哈~),方便自己也方便别人!最后,目录没有真正的好坏之分,只要适用于自己的业务,就是好的目录!

    文章同步到微信公众号:hans_iOS 有疑问可以在公众号里直接发

    相关文章

      网友评论

      • 上善若水zyz601:在用第二种
      • doudo:首先谢谢分享。项目中有一些基础的控件比如自己封装的button及basicViewcontroller,这些放在哪里比较合理呢。
      • 东东隆东抢:很蛋疼的问题讨论那么多,个人风格问题,没有孰优孰劣之说。
      • objcat:个人觉得还是用中文目录比较好 我并不认为中文目录很low 它可以更清晰的表达每个工程模块的含义 工程目录为什么存在 不就是给人看的么 中国人看中文当然是最方便的 何乐而不为?
      • HMZ4978:我在用第二种, 第二种找文件太不方便了 ..
      • Koson:这个面试官估计就是我吧!
      • YoNotes:说简单点,把模块插件化。
      • YoNotes:个人感觉。MVC或衍生的MVCS等架构。。不能从根本上解决耦合问题。。剥离逻辑层,UI层,增加公共代码量,ViewController 只负责生命周期和SDK代理方法,适应多种SDK 。。感觉代码结构这样才对。不是分的如何好,而是,你写的模块能快速移植,而且基本不报错,调用基本一句话。代码横向写,耦合性低,g高度模块化低耦合才是关键。。只是我最近被公司几次大更和加新SDK ,被迫改了自己代码写法。。一点个人想法而已,还在探索
        乱了夏末丶蓝了海:@V胜利女神在微笑 求分享,可以view不能像vc单独分出来,像html和css那样
      • 闻道刘:说什么命名low不low的,先说说自己的英文水平。一些程序员的英文命名,让人头大。命名的作用就是起提示作用的,如果你的命名误导他人,反而起了反效果。你觉得自己的命名很好,那极有可能是你的英文你觉得man和male,yes和true没区别。甚至把优惠翻译成youhui,yh,这样的,他们当时也觉得自己的命名是很好的。所以,命名就是一目了然没歧义。
        闻道刘:个人觉得图片中的命名方式可以接受
      • Charles___:我会一般每个目录有model view cotroller 和request,我是将request分模块,而且感觉中文确实不太合适做目录。
      • 天堂秀:刚好能用上,不错!题主,我关注了你,你也关注我吧!
        汉斯哈哈哈:@天堂秀 具体还是得根据项目业务来分的,不是一成不变 :grin:
      • 杏仁丶:感谢分享!!!
      • YungFan:喜欢第二种
      • Caiflower:没看错的话,最后一句的"多谢注释"应该是"多写注释",感谢分享,一直用的第二种,忽然看到第一种好像感觉也很不错
        汉斯哈哈哈:@花菜ChrisCai 谢谢提醒!:smile:
      • fankang:不喜欢第一种,接手几个好多项目用的第一种,简直就是糟糕透顶,命名不规范,乱七八糟,用第二种,即使不规范,也能最快速在一个文件夹下找到
      • jqjs:赞
      • blurryssky:哈哈哈 若使用此两种 必然显得呆板幼稚
        blurryssky:@汉斯哈哈哈 :smile:
        汉斯哈哈哈:@blurryssky 哈,中小项目足够了,大项目另当别论~
      • 听雨花春风:刚好要学
      • dongwenbo:可以写中文的
      • b066d03877fb:请问楼主,Release(发布器) 主要做什么操作呢?
      • fcaef508d4de:第一种
      • HenryCheng:学习
      • 墨狂之逸才:你这边的业务和MVC等同,软件页面功能是模块的意思?我一直以为业务就是功能页面,然后模块的意思就是MVC。
      • Abekkkkk:想问一下Release目录下是放些什么东西的?
      • 75c7ec803f6b:这个Release目录是用来放什么的呢?
      • Obsession丶执:楼主仿了简书的APP吗?
        Obsession丶执:@汉斯哈哈哈 厉害,简叔都给你打赏了 :smile:
        汉斯哈哈哈:@被窝里埋葬着青春 恩
      • ChenJZ:个人喜欢第二种,从文件耦合度来讲,模块里的文件耦合度相对来说比较高,而每一层(比如Model层)里面的各个model的耦合度相对比较低。开发功能的时候,涉及到的类基本都是该模块里面的类,很少会出现跨目录的情况, 而第一种情况则需要经常会跨目录。这也是符合我们软件设计中的高内聚低耦合的思想。
        墨狂之逸才:@ChenJZ 同意,一个功能模块里面基本上很独立,也能快速定位到你要找的视图或控制器。
      • 60fea85d7efa:用第二种方式 :smile:
      • 1eb4e073cd0b:此公分组名也是醉了,单复数使用不当,英语没学好,中英文混排,注释太多就是代码的失败,我带团队,谁写注释谁就是代码表达不清,难以委以重任!
        1eb4e073cd0b:@MissAngel 关键的、复杂的、难以转过弯的注释肯定要有,此文注释的层次太low
        依依爸爸:你好厉害 不写注释人走了 要维护不得重新看代码 还得去理解 碰到写的不好的人 那不是坑人
        风茗夜雨:好厉害 ,都不带注释的!其他人怎么修改?
      • 1eb4e073cd0b:哥从不明文分组models views viewcontrollers,太幼稚,太分散,我直接业务放一起main,main中按业务有序归类,与main平级的有beans network db sns im payment codecs utils vendors resources等,utils有自定义的公共的views viewcontrollers categories等,以及hud account fileutils工具类,完美!
      • 1664b0213672:找文件不方便?不是Cmd+Shift+O么,从来不会在文件树中去找文件, 效率太低
        1664b0213672:@汉斯哈哈哈 你这么说好像有点道理, 不过我喜欢上手快的新人,
        汉斯哈哈哈:@0xff 后续新人也是这样找吗?显然不能...
      • seongbrave: 大神您好,最近在研究mvvm设计模式,确实觉得第二种更加合适,但是关于第二种有个最大的问题就是,有些app业务模块会非常多, 如果就简单的分成四个业务,最后每一个业务模块地下的文件类又会非常多,业务模块一般分多少了,就是按照tabbar的模块分的吗? 经常有通知模块,设置模块,发布信息模块,登录模块,好友模块等等,是不是都分成一个模块呢?
        汉斯哈哈哈:@seongbrave 可以建个Base文件,或直接放在对应的业务文件也可以,文件一多其实也增加查找成本。
        seongbrave:@汉斯哈哈哈 如果我定义了一些父类,控制器的父类类似这种的,你会把这些父类放在哪呢?
        汉斯哈哈哈:@seongbrave 像发布类型的,属于公用的,可以单独抽出来。四个业务模块里,至于里面要不要分,还是取决你的业务复杂度。
      • 93ffef87e527:大概看了一下,这里的评论清一色地支持第二种(占绝大多数),个人比较费解,为什么造成如此局面;
        在CocoaChina上回复的有些不同的声音,这才科学,学术、技术本就需要多样化的嘛。
        虽然贴主对两个结构优劣作对比分析,但并没有抛出自己对两者的主观判断,楼主倾向哪个?
        至于说哪个更好,仁者见仁,智者见智了。
        bcee5dd5dd26:@iJecky 第二种
      • 沉默的雨:现在自己一般用第二种 比较好分辨
      • e4135f2a6fae:个人喜欢第二种模式
      • LeoDaxia:个人还是喜欢先按模块分,然后按业务分。
        公共类可以专门在外面搞个Common文件夹嘛。
        示例:

        Classes
        |
        |-- Common -- Model
        | |-View
        | |-Controller
        |
        |-- Home -- Model
        | |-View
        | |-Controller
        |
        |-- Message -- Model
        | |-View
        | |-Controller
        |
        |-- Discover -- Model
        | |-View
        | |-Controller
        |
        ……
        LeoDaxia:@LeoiOS :smirk:
      • JamesYu:根据项目来,不一定生搬硬套。只要分清楚都可以的
        汉斯哈哈哈:@JamesYu 😆
      • BlackBright_:学习一下
      • e97915c51a5e:个人偏向于“主目录按照模块分类,内目录按照业务分类”
        汉斯哈哈哈:@Oblama 嗯,第一种弊端比较明显。
      • ColaBean:以前都是第一种,后来用着不是很方便就改为第二种
        汉斯哈哈哈:@ab3060daf1ce 看来第一种确实不利于开发
      • Toly:好像说的有些道理啊、
        汉斯哈哈哈:@重楼_ :grin:
      • 25f171ed0966:都有一定程度局限 罪因是没法给文件夹加tag
        汉斯哈哈哈:@bukkake :sweat_smile:
      • 许还真:有意识就可以了。分分类
        汉斯哈哈哈:@8f31bf8e34b4 :grin:
      • 公爵海恩庭斯:目测使用这两种目录结构的大概是普通工程师。
        公爵海恩庭斯:@汉斯哈哈哈 Model 对应系统中的实体。参考http://cc.cocimg.com/api/uploads/20150525/1432542362309133.png
        公爵海恩庭斯:@汉斯哈哈哈 不敢当。小的项目用MVC还可以。如果项目大了,人多了,MVC这样的重量级视图控制器会带来很多冲突。 你可以考虑一下 MVVM,View Controller 对应交互设计;View-Model对应产品业务逻辑。
        汉斯哈哈哈:@公爵海恩庭斯 大神是怎么分的?😋
      • MrDealer:这面试官很有经验
      • Jagtu:目录结构确实重要,但是我觉得跟其架构能力关系比较大,还是不能很好反映出开发经验,很多初学者也能使用出您所说的两种模式,很不巧,当年我的第一个项目就是用第一种结构,嘿嘿( :blush: 羞羞)
      • 18c5341b83cb:还可以 赞下
        汉斯哈哈哈:@遗忘的小角落 😊
      • TimBao:个人项目的话,比较随便一点了。如果是多人项目,还是“按主目录按照业务分类,内目录按照模块分类”比较好,这样方便团队成员按业务模块划分。当然了,每个团队风格不一样,分工也不同,还得看实际情况。如果团队按业务划分工作,那么无疑“按主目录按照业务分类,内目录按照模块分类”比较好。
      • Ronda:先分模块,然后模块里面mvc是很好且高效的方法,遇到共用模块单独建一个模块叫common,都放到这里面。先mvc,再模块,模块太多结构复杂时会花费大量的时间在文件切换上,多人合作时弊端更甚。
        另外推荐一个终端插件,名叫synx,可以通过xcode的虚拟文件目录构建实体文件目录,直接在xcode中建文件夹,然后拉终端里跑一遍就生成了对应的实体文件夹。支持svn和cocoapods
        饥渴的狗崽子:@Ronda 自从用了synx,腰也不疼了,腿也不酸了
        汉斯哈哈哈:@川哥iOSHipster good,有机会试下
      • f7c3815ffea0:大神,刚从培训机构培训完,找工作要注意点什么啊?
        汉斯哈哈哈:@触心 好好去梳理下知识点,攻克下面试题,然后平常心! :smile:
      • f7c3815ffea0:我竟然把评论也看完了,我是刚从培训机构,培训完的新手,请多关照。楼主写的真好
      • be1bccfda61f:之前是先MVC然后各个模块,后面发现新建模块要跨越n多级文件结构就觉得这种不太好,等到后面模块越来越多,真的发现先MVC完全没好处,后面就 先模块然后每个模块再MVC,至于一些通用的MVC文件就直接单独建在和模块同级,现在实践下来还不错。
        be1bccfda61f:@川哥iOSHipster 握手,感觉MVC只是具体实现方法,而模块是项目需求。
        今天用MVC,明天可能就用MVVM,而需求不会变。
        Ronda:@张小刚哟 那确实,特别是大项目,经常找个控制器对应的tableviewcell找半天。如果不是自己写的,更难找。还是分模块,模块里面mvc比较好
        汉斯哈哈哈:@张小刚哟 深有体会,之前我痛苦过,为一个朋友的项目改bug。
      • 唤灵者:一个枣糕的目录会让人对工程瞬间失去兴趣。很多人还在纠结虚拟文件夹与实体文件夹到底要不要一一对应。
        Yaanco:@仲系xbb 赞同
        96dfced25580:@汉斯哈哈哈 强迫症表示,实体文件夹与虚拟文件夹都要对应,因为这样看着舒服啊,尤其当人finder打开你的项目根目录,那种各个模块一目了然的感觉.....超赞,好吧,我已经强迫我team里的人这样做,细节有时候也是很重要的,整齐必然有它的好处。
        汉斯哈哈哈:@唤灵者 对
      • 09c236ea6ff2:重来没自己分过 因为从未做过从无到有的项目
        汉斯哈哈哈:@09c236ea6ff2 可以琢磨下,自己搭建的话,改怎么分配去目录结构。
      • MJGA:搞别的也都一样。
任何工种都可以打开电脑看下自己的工作文件夹。
层次结构设计和文件夹命名都可以看出工作经验,也很大程度上可以看出工作态度和工作能力。
        bc973163d996:工作态度和工作能力
        moxacist:看了这么多,都是2方法,头像好多银
        汉斯哈哈哈:@简叔 对,很意外获得简叔的打赏。😋3q
      • 58f0b442f46c:我一般是第二个模式,不知道作者如何?
        汉斯哈哈哈:@菜bird 😋
        c3b3f1ad6e39:@汉斯哈哈哈 同样第二种
        汉斯哈哈哈:@JokerIsJoker 我倾向于第二种,当项目庞大时,第一种查找对应文件成本比较高。
      • FengxinLi:谢谢楼主分享。请问后面中文文件可以直接这样用?
        汉斯哈哈哈:@Fengxinliju 对,所以目录结构对前期开发效率跟后期拓展维护都很重要。
        FengxinLi:@汉斯哈哈哈 其实我看你目录,一目了然。很清楚。感觉很好。
        汉斯哈哈哈:@Fengxinliju 这个没关系的,只要方便开发者阅读就行了,而且新来的同事特别喜欢这样的命名,哈哈。
      • windgo:有一个思路, 是控制每级目录的数量. 比如超过10个, 就把一些放到下一级去.
        汉斯哈哈哈:@itwindgo 不一定,因为层级太深也不好。就算10其实也不多,一眼也能快速定位对应的业务。其实能不分级尽量不要分,文件夹一多也增加点击的成本!
      • 庞大不小:我主目录是功能模块,内容目录是MVC的.
        这样,看目录结构,更高效.
        汉斯哈哈哈:@九夕 开发中不会因为mvc几个目录切换而烦恼?
      • e8b6cbadf7fb:看标题就决定点赞了,深深赞同作者的观点!
        汉斯哈哈哈:@意林 谢谢😄
      • 启瓴:主目录按MVC,开发一个功能模块时,找文件的跨度太大,很不方便。
        汉斯哈哈哈:@鹰哥 对,经常切换目录很麻烦
      • sunljz:View , ViewController , 图片资源 一般是按页面分,Model就自己单独一个,内部按功能分
        汉斯哈哈哈:@sunljz 几张jpg的话,不妨改下文件路径,还是可以显示的, Images.xcassets很好用,不要浪费,有时候直接可以在xcode上对图片拉伸做处理,很方便。
        sunljz:@汉斯哈哈哈 因为有 jpg 图,又想统一管理,所以不用那个 Images.xcassets
        汉斯哈哈哈:@sunljz 图片资源现在都用Images.xcassets去管理了
      • LostAbaddon:“面试官既然问他怎么分目录结构的”
        这里的“既然”应该是“竟然”吧。。。。。。
        唤灵者:很多蓝荒棱都分不清拼音的写法。所以打字难免出现错别字。看懂冇问题啦~
        Yaanco:@汉斯哈哈哈 :+1:
        汉斯哈哈哈:@ChronosTartaro 文字控 :joy:
        既然表示先提出前提,而后加以推论,常用“就”、“也”、“还”等配搭
        竟然表示出乎意料或常情常理以外
        我改...
      • 黄穆斌:确实很重要。尤其是程序比较大的时候。
        汉斯哈哈哈:@黄穆斌 恩,貌似你很闲不用敲代码的... :grin:
        黄穆斌:@汉斯哈哈哈 哈哈哈。毕竟这关系到接下来顺手不顺手的问题。
        汉斯哈哈哈:@黄穆斌 每次刚搭项目时,就跟同事争论得你死我活😂

      本文标题:iOS 项目的目录结构能看出你的开发经验

      本文链接:https://www.haomeiwen.com/subject/myzwqttx.html