#0,無名 ,無題 ,2019/09/29(日) 17:25:36.711 ID:ZruFYwP6 ,No.16139383 ,
寫註解好苦啊
組員的程式碼到底完成了沒有也不給我知道
明明死線是今天的說...

, #1,無名 ,2019/09/29(日) 17:27:06.455 ID:xJotLTY2 ,No.16139393 ,
>>16139383
開啟不寫註解運動
, #2,無名 ,2019/09/29(日) 17:28:04.354 ID:ZruFYwP6 ,No.16139402 ,
>>16139393
這樣惠玲婚

, #3,無名 ,2019/09/29(日) 17:29:40.144 ID:oPiFz/YA ,No.16139417 ,
>>16139402
用命名原則與隱喻來取代註解。

, #4,無名 ,2019/09/29(日) 17:30:56.424 ID:oPiFz/YA ,No.16139433 ,
>>16139402
不相信的話泥把一段程式碼丟上來,窩來試著改寫成不需要註解也能看兜董

, #5,無名 ,2019/09/29(日) 17:31:44.154 ID:str0p4hM ,No.16139443 ,
function會被維護 但註解不一定會被記得跟著一起更新
之前才有人被註解害死 讓整個公司的員工薪水每位多發了幾K
, #6,無名 ,2019/09/29(日) 17:35:50.025 ID:ZruFYwP6 ,No.16139478 ,
>>16139417
>>16139433
沒辦法不寫拉
老師好像規定不寫就0分 有點忘了
不過我也怕組員在口試的時候突然看不懂我寫的部分就爆炸惹

, #7,無名 ,2019/09/29(日) 17:37:04.624 ID:oPiFz/YA ,No.16139488 ,
>>16139478
泥鳩跟老師縮"我的註解鳩素程式"
蔗才素業界標準ㄛ

, #8,無名 ,2019/09/29(日) 17:41:19.520 ID:ztK79CEQ ,No.16139540 ,
當個全程自幹的高手呀
報告時組員名單就只列自己
, #9,無名 ,2019/09/29(日) 17:47:14.563 ID:oPiFz/YA ,No.16139607 ,
>>16139540
自幹也很噗錯ㄛ,溝通成本大幅下降。
而且窩相信泥們的架構應該也混散亂,自幹OK兜。

, #10,無名 ,2019/09/29(日) 18:26:52.496 ID:ZruFYwP6 ,No.16140098 ,
>>16139488
挖幹 真的假的
我們糞校教計概的教授都告訴我們寫程式要有註解欸
>>16139540
>>16139607
其實程式也經有八成都是我寫的了
組員只負責其中一個任務
不過流程圖之類的文書我都丟給他做
不知道這樣對他好不好啦

, #11,無名 ,2019/09/29(日) 18:29:48.315 ID:oPiFz/YA ,No.16140130 ,
>>16140098
窩不拿別倫的杹壓泥,你丟粗一段你寫好註解的程式,我改丸後你再告訴我哪郭比較好。

, #12,無名 ,2019/09/29(日) 18:32:38.604 ID:SGpmoIVk ,No.16140159 ,
>>16140098
我看是沒救了

, #13,無名 ,2019/09/29(日) 18:32:40.949 ID:ZruFYwP6 ,No.16140160 ,
>>16140130
我第一次用AA的功能
不知道這樣用對不對
void Dungeon::Read( int read ) {
int goal = -1 ;
while ( read == 2 && goal == -1 ) { // 讀任務二的目標並測試有沒有效
cout << "Please Input number of goal :" ;
goal = Decide_Error_or_number() ;
} // while
string file = "", line = "", str_x = "", str_y = "" ;
ifstream input( file ) ;
while ( !input ) { // 讀檔案名稱並測試有沒有效
cout << "Please Input file name :" ;
cin >> line ;
file = "input" + line + ".txt" ;
input.open( file ) ;
} // while
int test = 0 ;
getline( input, line ) ; // 讀input第一行到line
for ( int check = 0 ; check < line.size() && test != -1 ; check++ ) { // 紀錄xy軸
if ( line.at( check ) != ' ' ) // 找到x的數字
test++ ;
if ( line.at( check ) == ' ' && test != 0 ) { // 找完x的數字後把第一行拆兩部分並轉成數字
test = -1 ;
str_y = str_y.assign( line, check, line.size() - check ) ; // 後半段切成y字串
str_x = str_x.assign( line, 0, check ) ; // 前半段切成x字串
x = stoi(str_x) ; // 轉成數字
y = stoi(str_y) ; // 轉成數字
} // if
} // for
map.resize( y ); // 重設y軸大小
for ( int now_y = 0 ; getline( input, line ) ; now_y++ ) { // 記錄地圖( 跑y軸部分 )
map[now_y].resize( x ) ; // 重設x軸大小
for ( int now_x = 0 ; now_x < line.size() ; now_x++ ) { // 記錄地圖( 跑x軸部分 )
if ( line.at( now_x ) == 'O' )
map[now_y][now_x] = 1 ;
if ( line.at( now_x ) == 'E' )
map[now_y][now_x] = 2 ;
if ( line.at( now_x ) == 'G' )
map[now_y][now_x] = 0 ;
} // for
} // for
if ( goal == -1) // 如果沒有讀goal就進入任務一
Mission1() ;
else
Mission2( goal ) ;
} // Read()
, #14,無名 ,2019/09/29(日) 18:34:51.645 ID:rRNmLXlM ,No.16140176 ,
>>16140160
這註解有跟沒有一樣阿
, #15,無名 ,2019/09/29(日) 18:34:57.974 ID:JqXO0RCY ,No.16140178 ,
>>16140160
> int test = 0
我看你是想飛天膩??
, #16,無名 ,2019/09/29(日) 18:36:46.859 ID:oPiFz/YA ,No.16140201 ,
>>16140160
確認一下ㄛ,C++?

, #17,無名 ,2019/09/29(日) 18:37:50.900 ID:ZruFYwP6 ,No.16140208 ,
>>16140178
對噗起...這種用完就丟的我都叫test...
>>16140201
是的
, #18,無名 ,2019/09/29(日) 18:40:34.817 ID:LljrQiuE ,No.16140232 ,
>>16140160
read == 2
goal == -1
誰知道你的2和-1是三小
你不會寫個macro或enum嗎
每次看到這種return值意義不明的我都很火大
, #19,無名 ,2019/09/29(日) 18:41:52.443 ID:74KndEio ,No.16140247 ,
>>16140160
脫褲子放屁= =
, #20,無名 ,2019/09/29(日) 18:43:10.152 ID:74KndEio ,No.16140261 ,
如>>16140232所說
你不註解什麼是read goal
寫那種一看就懂得幹嘛
, #21,無名 ,2019/09/29(日) 18:45:06.527 ID:QW2yUJg6 ,No.16140277 ,
>>16140160
你的註解是什麼垃圾
, #22,無名 ,2019/09/29(日) 19:00:27.797 ID:oPiFz/YA ,No.16140440 ,
>>16140160
先企ㄘ晚餐
ifstream tryOpenNewFile()
{
string file = "", line = "";
ifstream input( file ) ;
while ( !input ) { // 讀檔案名稱並測試有沒有效
cout << "Please Input file name :" ;
cin >> line ;
file = "input" + line + ".txt" ;
input.open( file ) ;
} // while
return input;
}
bool missionChecker(int mission,int goal){
switch(mission)
{
case 2:
//mission_2 must select goal
return goal != -1;
default:
return true;
}
}
void Dungeon::Read( int mission ) {
ifstream tryOpenNewFile();
//----------
//TODO
int test = 0 ;
string line;
string str_x = "", str_y = "" ;
getline( input, line ) ; // 讀input第一行到line
for ( int check = 0 ; check < line.size() && test != -1 ; check++ ) { // 紀錄xy軸
if ( line.at( check ) != ' ' ) // 找到x的數字
test++ ;
if ( line.at( check ) == ' ' && test != 0 ) { // 找完x的數字後把第一行拆兩部分並轉成數字
test = -1 ;
str_y = str_y.assign( line, check, line.size() - check ) ; // 後半段切成y字串
str_x = str_x.assign( line, 0, check ) ; // 前半段切成x字串
x = stoi(str_x) ; // 轉成數字
y = stoi(str_y) ; // 轉成數字
} // if
} // for
map.resize( y ); // 重設y軸大小
for ( int now_y = 0 ; getline( input, line ) ; now_y++ ) { // 記錄地圖( 跑y軸部分 )
map[now_y].resize( x ) ; // 重設x軸大小
for ( int now_x = 0 ; now_x < line.size() ; now_x++ ) { // 記錄地圖( 跑x軸部分 )
if ( line.at( now_x ) == 'O' )
map[now_y][now_x] = 1 ;
if ( line.at( now_x ) == 'E' )
map[now_y][now_x] = 2 ;
if ( line.at( now_x ) == 'G' )
map[now_y][now_x] = 0 ;
} // for
} // for
//--------------
int goal;
do{
cout << "Please Input number of goal :" ;
goal = Decide_Error_or_number();
}while ( false == missionChecker(mission,goal))
bool isEnterMission2 = goal != -1;
if(isEnterMission2)
{
Mission2(goal);
}
else{
Mission1();
}
}

, #23,無名 ,2019/09/29(日) 19:07:18.102 ID:Is/gUp5. ,No.16140539 ,
>>16140098
讀資工畢業會寫程式的一屆裡大概沒幾個啦
一堆國立畢業後跟文組的差不多
作業自幹就對了
管他的未來怎樣勒
未來是自己的 別人沒必要對他負責
, #24,無名 ,2019/09/29(日) 19:24:38.428 ID:JXbweHyU ,No.16140782 ,
文組的表示看不懂

, #25,無名 ,2019/09/29(日) 19:51:47.649 ID:oPiFz/YA ,No.16141140 ,
>>16140440
>>16140160
大概先蔗樣,下面那段GOAL的部分窩感覺跟任務選取沒有太直接的關係,泥可能要重新思考一下大段邏輯。
ifstream openDungeonMap()
{
string file = "", line = "";
ifstream input( file ) ;
do{
cout << "Please Input DungeonMap file name :" ;
cin >> line ;
file = "input" + line + ".txt" ;
input.open( file ) ;
}while ( !input )
return input;
}
bool missionChecker(int mission,int goal){
switch(mission)
{
case 2:
//mission_2 must select goal
return goal != -1;
default:
return true;
}
}
missionSelector(){
}
std::tuple<int, int> getDungeonMapSize(string mapInfo)
{
int test = 0 ;
int mapSizeX,mapSizeY;
string str_x = "", str_y = "" ;
for ( int check = 0 ; check < mapInfo.size() && test != -1 ; check++ ) { // 紀錄xy軸
if ( mapInfo.at( check ) != ' ' ) // 找到x的數字
test++ ;
if ( mapInfo.at( check ) == ' ' && test != 0 ) {
// 找完x的數字後把第一行拆兩部分並轉成數字
test = -1 ;
str_y = str_y.assign( mapInfo, check, mapInfo.size() - check ) ;
str_x = str_x.assign( mapInfo, 0, check ) ;
mapSizeX = stoi(str_x) ;
mapSizeY = stoi(str_y) ;
}
}
return std::make_tuple(mapSizeX, mapSizeY);
}
int getMapTokenEnum(string token)
{
switch(token)
{
case 'O':
return 1;
case 'E':
return 2;
case 'G':
return 0;
default:
return -1;
}
}
void setDungeonMap(ifstream dungeonMap)
{
string dungeonInfo;
getline( dungeonMap, dungeonInfo );
std::tuple<int, int> dungeonMapSize = getDungeonMapSize(dungeonInfo);
int sizeX = std::get<0>(dungeonMapSize);
int sizeY = std::get<1>(dungeonMapSize);
//----
map.resize(sizeY);
string mapTokenPerLine;
for ( int now_y = 0 ; getline( dungeonMap, mapTokenPerLine ) ; now_y++ ) { // 記錄地圖( 跑y軸部分 )
map[now_y].resize( sizeX ) ;
for ( int now_x = 0 ; now_x < mapTokenPerLine.size() ; now_x++ ) {
string mapToken = mapTokenPerLine.at( now_x );
map[now_y][now_x] = getMapTokenEnum(mapToken);
}
}
}
void Dungeon::Read( int mission ) {
ifstream dungeonMap = openDungeonMap();
setDungeonMap(dungeonMap);
//----
//TODO:邏輯有點微妙,需要釐清Decide_Error_or_number到底是幹嘛的才能整理下去。
int goal;
do{
cout << "Please Input number of goal :" ;
goal = Decide_Error_or_number();
}while ( false == missionChecker(mission,goal))
bool isEnterMission2 = goal != -1;
if(isEnterMission2)
{
Mission2(goal);
}
else{
Mission1();
}
}

, #26,無名 ,2019/09/29(日) 19:52:46.922 ID:37D5cyY6 ,No.16141151 ,
>>16141140
讓人煩躁的語障
, #27,無名 ,2019/09/29(日) 19:54:37.749 ID:oPiFz/YA ,No.16141175 ,
>>16140782
枚關係,窩也有看木有董。

, #28,無名 ,2019/09/29(日) 19:55:19.160 ID:oPiFz/YA ,No.16141184 ,
>>16141151

, #29,無名 ,2019/09/29(日) 20:00:47.146 ID:tMAIu.ag ,No.16141240 ,
>>16140539
真的
還遇過有人連梯形的*都不會印😂
, #30,無名 ,2019/09/29(日) 20:01:03.179 ID:wZ2rsXtY ,No.16141246 ,
>>16140160
if 和迴圈就不用畫蛇添足了 除非你的花掛號好幾層不好讀再做標註
重點放在變數的作用和解釋code做了什麼就好
, #31,無名 ,2019/09/29(日) 20:08:13.163 ID:wZ2rsXtY ,No.16141325 ,
>>oPiFz/YA
語障除了在程設版用雕蟲小技騙騙新手刷優越感還會上綜合?
, #32,無名 ,2019/09/29(日) 20:12:48.096 ID:oPiFz/YA ,No.16141377 ,
>>16141325
謾罵不會讓你進步,你為何不要協助原PO寫出更好的程式呢?

, #33,無名 ,2019/09/29(日) 20:17:19.401 ID:wZ2rsXtY ,No.16141434 ,
>>16141377
因為你講的答案有一半是智障跳針
而且也不會讓原po寫得更好
, #34,無名 ,2019/09/29(日) 20:20:52.493 ID:oPiFz/YA ,No.16141474 ,
>>16141434
>No.16141434
>因為你講的答案有一半是智障跳針
>而且也不會讓原po寫得更好
你...還好嗎?生活有問題要縮出乃阿

, #35,無名 ,2019/09/29(日) 20:24:11.946 ID:gl32/Lzk ,No.16141527 ,
>>16141474
最喜歡這種會寫程式又耐心教人可愛又有趣的粗乃丸了

, #36,無名 ,2019/09/29(日) 20:32:19.038 ID:mfS9tt6I ,No.16141615 ,
>>16140160
其實
就是將一個大雜燴的函式
拆成多個 每個做的事單純一點
最後 用一個有意義的名字去命名他

, #37,無名 ,2019/09/29(日) 20:33:49.004 ID:oPiFz/YA ,No.16141630 ,
>>16141140
>>16141615
對ㄛ,其實鳩煮素這樣而已ㄛ
/*
*由呼叫Dungeon的位置開啟檔案比較妥善
ifstream openDungeonMap()
{
string line = "";
do{
cout << "Please Input DungeonMap file name :" ;
cin >> line ;
input.open( "input" + line + ".txt" ) ;
}while ( !input )
return input;
}*/
std::tuple<int, int> getDungeonMapSize(string mapInfo)
{
//private
int test = 0 ;
int mapSizeX,mapSizeY;
string str_x = "", str_y = "";
//TODO:Google trim , and split/strtok
for ( int check = 0 ; check < mapInfo.size() && test != -1 ; check++ ) {
if ( mapInfo.at( check ) != ' ' )
test++ ;
if ( mapInfo.at( check ) == ' ' && test != 0 ) {
test = -1 ;
str_y = str_y.assign( mapInfo, check, mapInfo.size() - check ) ;
str_x = str_x.assign( mapInfo, 0, check ) ;
mapSizeX = stoi(str_x) ;
mapSizeY = stoi(str_y) ;
}
}
return std::make_tuple(mapSizeX, mapSizeY);
}
int getMapTokenEnum(string token)
{
//private
switch(token)
{
case 'O':
return 1;
case 'E':
return 2;
case 'G':
return 0;
default:
return -1;
}
}
void setDungeonMap(ifstream dungeonMap)
{
//private
string dungeonInfo;
getline( dungeonMap, dungeonInfo );
std::tuple<int, int> dungeonMapSize = getDungeonMapSize(dungeonInfo);
int sizeX = std::get<0>(dungeonMapSize);
int sizeY = std::get<1>(dungeonMapSize);
//----
map.resize(sizeY);
string mapTokenPerLine;
for ( int now_y = 0 ; getline( dungeonMap, mapTokenPerLine ) ; now_y++ ) {
map[now_y].resize( sizeX ) ;
for ( int now_x = 0 ; now_x < mapTokenPerLine.size() ; now_x++ ) {
string mapToken = mapTokenPerLine.at( now_x );
map[now_y][now_x] = getMapTokenEnum(mapToken);
}
}
}
bool missionChecker(int mission,int goal){
//private
switch(mission)
{
case 2:
//mission_2 must select goal
return goal != -1;
default:
return true;
}
}
void StartMission( int mission ){
//public
//TODO:需整理主要邏輯,對應可能出現的Mission3,Mission4
int goal;
do{
cout << "Please Input number of goal :" ;
goal = Decide_Error_or_number();
}while ( false == missionChecker(mission,goal))
bool isEnterMission2 = goal != -1;
if(isEnterMission2)
{
Mission2(goal);
}
else{
Mission1();
}
}
void Dungeon::Read(ifstream dungeonMap) {
setDungeonMap(dungeonMap);
//Mission的啟動由外部呼叫比較妥善
}

, #38,無名 ,2019/09/29(日) 20:33:52.423 ID:70paUWvs ,No.16141633 ,
>>16139417
實在不知道在程式中使用隱喻是不是一件好事
, #39,無名 ,2019/09/29(日) 20:37:39.173 ID:WBVZHPJE ,No.16141677 ,
>>16141630
真希望我跟粗乃丸一樣會丸
, #40,無名 ,2019/09/29(日) 20:39:30.158 ID:oPiFz/YA ,No.16141704 ,
>>16141633
看你囉,窩素覺得不錯。
隱喻幫助你確認邏輯有無瑕疵。
也可能幫助你(或接手的人),快速理解程式的綱要。
對於重構與追蹤來說,隱喻更顯得很重要。
但是使用隱喻的程式會看擠奶呆呆兜,因此很多自認GEEK的輪噗喜歡用。

, #41,無名 ,2019/09/29(日) 20:40:24.899 ID:gl32/Lzk ,No.16141718 ,
>>16141704
哪個部分是隱喻呢?

, #42,無名 ,2019/09/29(日) 20:45:56.042 ID:oPiFz/YA ,No.16141796 ,
>>16141718
大至功能(Function)的名稱,小到變數的命名。
都可以隱喻,至於隱喻該到哪種程度,鳩要看經驗惹。
例如原PO的read變數,仔細閱讀後發現其俗比較像是任務代號(mission),
因此就應該做一下調整,改為mission。

, #43,無名 ,2019/09/29(日) 20:47:04.920 ID:Vn.rmG2M ,No.16141814 ,
>>16141630
挖...謝謝好心丸
我下次作業也開始試著這樣寫

, #44,無名 ,2019/09/29(日) 20:49:05.948 ID:AjtVJWCM ,No.16141837 ,
>>16141796
這是霊夢ㄇ
, #45,無名 ,2019/09/29(日) 20:50:31.104 ID:oPiFz/YA ,No.16141856 ,
>>16141718
又或者原PO有一段城素漲這樣
if ( line.at( now_x ) == 'O' )
map[now_y][now_x] = 1 ;
if ( line.at( now_x ) == 'E' )
map[now_y][now_x] = 2 ;
if ( line.at( now_x ) == 'G' )
map[now_y][now_x] = 0 ;
閱讀擠萊應該素"取得該行特定位置的字符,轉換為對應的數字編號"
因此就可以改寫成這樣
int getMapTokenEnum(string token)
{
//private
switch(token)
{
case 'O':
return 1;
case 'E':
return 2;
case 'G':
return 0;
default:
return -1;
}
}
string mapToken = line.at( now_x );
map[now_y][now_x] = getMapTokenEnum(mapToken);

, #46,無名 ,2019/09/29(日) 20:50:40.729 ID:WBVZHPJE ,No.16141860 ,
>>16141837
仕魂 娜可露露
, #47,無名 ,2019/09/29(日) 20:53:28.280 ID:oPiFz/YA ,No.16141910 ,
>>16141837
不清楚,窩猜素(侍魂)娜可露露

, #48,無名 ,2019/09/29(日) 20:53:42.690 ID:gl32/Lzk ,No.16141914 ,
>>16141796
也就是說取一個跟程式作用本身有關的變數與函式名稱嗎

, #49,無名 ,2019/09/29(日) 20:57:04.260 ID:8sPR2PYw ,No.16141965 ,
隱喻寫好的code好讀好學習
寫不好的code就像在讀咒語一樣難搞
, #50,無名 ,2019/09/29(日) 20:58:15.277 ID:oPiFz/YA ,No.16141983 ,
>>16141914
枚湊,糾真的只是這樣而已,
這樣做有幾個好處
1.讓你可以在模糊的狀況下進行概念性開發。
2.錯誤追蹤時可以快速理解正確應該如何運行。
3.重構時方便你進行思緒整理。
4.讓下一個人(或是三個月後的自己)日子好過。
5.開發時釐清有無多餘/缺少/可優杹的邏輯。
命名月清楚越好,同時也代表你的程式段落內的關聯性越強。

, #51,無名 ,2019/09/29(日) 21:00:32.221 ID:TXjexxYY ,No.16142003 ,
>>16141983
可是這樣不會容易造成命名很長嘛?
而且有時候打縮寫接手的人也未必看得懂
, #52,無名 ,2019/09/29(日) 21:01:12.313 ID:gl32/Lzk ,No.16142013 ,
>>16141983
謝謝粗乃丸!三個月後的我也會謝謝粗乃丸的
自動丸成的編譯器最好用

, #53,無名 ,2019/09/29(日) 21:01:13.168 ID:Vn.rmG2M ,No.16142014 ,
>>16141856
我是原po 謝謝好心丸的教學
才剛從大一計概放出來還不會其他指令
以後會注意隱喻的

, #54,無名 ,2019/09/29(日) 21:02:15.726 ID:dy0uAJ02 ,No.16142027 ,
>>16141983
粗乃玩你的薪水有多少?
隨便掰一個也好
讓我羨慕羨慕
, #55,無名 ,2019/09/29(日) 21:03:16.504 ID:CfMKMqx2 ,No.16142040 ,
>>16142003
沒有要你縮寫阿= =
把你要幹的事情直白的打成function名稱幹嘛要縮寫
, #56,無名 ,2019/09/29(日) 21:04:31.205 ID:8sPR2PYw ,No.16142052 ,
>>16142003
命名很長好過太短
看過那種用各種拼音來取名的真的頭大
, #57,無名 ,2019/09/29(日) 21:05:41.794 ID:oPiFz/YA ,No.16142068 ,
>>16142003
蔗鳩要取捨了
1.如果不打全名,簡寫惠噗會讓人看不懂。
2.團隊內有沒有公定的命名原則
3.這個產業領域(Domain)內有沒有專有的名稱,特別素可能會跟其他東西搞混。
4.使用簡寫並用註解後會不會只是把該命名的東西變成註解。
噗過有個很簡單的方式,讓你快速決斷,
鳩素交給你的PM/同事看一下,對於KnowHow熟悉,
但是沒有參與你負責功能的團隊成員。
只要它悶可以不用在你特別解說下看得懂,你這段CODE就過關惹。

, #58,無名 ,2019/09/29(日) 21:07:03.328 ID:wZ2rsXtY ,No.16142080 ,
>>16142003
除非是很常用的縮寫 不然還是寫清楚比較好
變數也要跟上下文相關
還有 該寫的註解還是要寫 命名取得再長都不如寫一點解釋來得好看 不是每個人都知道你在想啥 也不是每個人程度都跟你一樣
, #59,無名 ,2019/09/29(日) 21:08:01.447 ID:u1OmKktg ,No.16142095 ,
還是javascript方便多了
可以用中文當變數

, #60,無名 ,2019/09/29(日) 21:11:25.878 ID:CfMKMqx2 ,No.16142127 ,
>>16142095
你工作的地方要是準你這樣搞
馬上離職
, #61,無名 ,2019/09/29(日) 21:12:29.595 ID:T.eT7I8c ,No.16142143 ,
>>16140160
雖然你明天要交了 但是有種東西叫coding style可以查一下
然後那種stoi就不用寫註解了
寫註解範圍可以再大一點 像是if或function前面
不是像教小學生一句一句寫
, #62,無名 ,2019/09/29(日) 21:15:01.705 ID:oPiFz/YA ,No.16142166 ,
>>16142052
>命名很長好過太短
蔗我就要舉郭反面例子囉。
getPermissionByRoleAndLevel(role role,level level)
getPermission(role role,level level)
換言之,寫到後面其實撰寫時有一部分會發現困擾自己會是語感....
蔗就必須要多看多感覺了。

, #63,無名 ,2019/09/29(日) 21:18:57.748 ID:8sPR2PYw ,No.16142218 ,
>>16142166
看起來是單一函數要做的事太複雜,命名要短也難
也只有分拆成更短的函數,讓函數作用單純化
, #64,無名 ,2019/09/29(日) 21:21:35.987 ID:TXjexxYY ,No.16142246 ,
>>16142166
像這樣的情況
把部份解釋寫在函式註解裡面會比較好嗎?
, #65,無名 ,2019/09/29(日) 21:23:57.005 ID:oPiFz/YA ,No.16142268 ,
>>16142014
>>16141814
戀好隱喻不容易ㄛ,
除了藥學會這些程式語言的用法,你還需要多深入了解一些東西。
1.你的需求(作業),背後的邏輯,你必須能夠解釋給人聽。
2.相關函式的各種寫法,寫法其實會影響結構,結構又會逆流回隱喻的風格。
3.必須與自己進行各種掙扎。
噗過練會後好處真兜不少,加油ㄛ。

, #66,無名 ,2019/09/29(日) 21:27:06.483 ID:oPiFz/YA ,No.16142308 ,
>>16142246
>>16142218
自我掙扎囉,閉上眼,上綜合三分鐘,回來看程式。
可以五秒內從名稱推斷內容必且重新敘述給自己依然概念/方向正確,
鳩先當過關囉。(兩郭月後重新再看一次決定要不要重構)

,END