主頁 > 軟體設計 > 【C/C++】迷宮問題詳情分析--堆疊的應用

【C/C++】迷宮問題詳情分析--堆疊的應用

2020-12-18 11:56:57 軟體設計

文章目錄

  • 引言
    • 一,問題描述
    • 二,分析所用資料結構
    • 三、所需函式及其功能
    • 四、程式執行詳細框圖
    • 五、代碼實作-詳細注釋
      • 1、maze.h
      • 2、maze.c
      • 3、maze.c
    • 六,效果展示

引言

這是一個簡單的順序堆疊的應用求解迷宮問題,主要分享的是在求解這個問題的之前的準備,
分析所需的資料,獲得正確的資料結構,分析所需要的功能,劃分模塊,再分析各模塊中,需要的具體功能,以確定功能函式,
這樣也書寫代碼時,就可以事半功倍,

一,問題描述

迷宮求解問題
提出以一個m*n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙,迷宮問題要求,求出從入口(x,y)到出口(x,y)的一條通路,或得出沒有通路的結論,
基本要求:首先實作一個以鏈表作存盤結構的堆疊型別,然后撰寫一個求迷宮問題的非遞回程式,求得的通路,
要求用堆疊實作迷宮問題的求解

將要構建的迷宮:向下為x正方向;向右為y正方向

在這里插入圖片描述

二,分析所用資料結構

迷宮結構體用于存盤構建的迷宮資料,
坐標結構體和堆疊元素結構體都是服務于堆疊結構體,

在這里插入圖片描述

三、所需函式及其功能

這幅圖可以很清晰的,了解都有哪些函式,這些函式的功能又是什么,
圖中很多函式都是為了一個函式服務的,即求解迷宮的函式,
藍色底的函式,實作了但是沒有測驗,大家可以自行測驗

在這里插入圖片描述

四、程式執行詳細框圖

這是整個迷宮問題專案的詳細執行程序,大家可以先看看,到時候閱讀代碼也會更加清洗直觀,
不同的顏色,是一個不同的模塊,實作相應的功能

在這里插入圖片描述

五、代碼實作-詳細注釋

代碼相應的地方都有注釋,也體現了我思考的程序,如有錯誤或者更優解,歡迎在指正討論,

1、maze.h

#ifndef __MAZE_H__    
#define __MAZE_H__

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define TRUE 1
#define FALSE 0

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

#define COLUMN 10  //列
#define ROW 10	   //行

typedef struct{
	char** maze;		//迷宮二維陣列
	int** footprint;	//足跡二維陣列
	int row;
	int column;
}MazeType;

typedef struct{
	int x;
	int y;
}PosType;

typedef struct{
	int ord;			//通道塊在路徑上的序號
	PosType seat;		//通道塊在迷宮中的“坐標位置”
	int di;				//從此通道塊走向下一個通道塊的“方向”
}SElemType;

typedef struct{
	SElemType* base;
	SElemType* top;
	int stacksize;
}SqStack;

//構造一個空堆疊
bool InitStack(SqStack* S);
//初始化迷宮資料
bool InitMaze(MazeType* M);
//判斷是否為空堆疊
bool IsStackEmpty(SqStack S);
//入堆疊,元素e為新的堆疊頂元素,傳入e形參拷貝值,回傳改變的堆疊S,及是否入堆疊成功
bool Push(SqStack* S, SElemType e);
//出堆疊,指標傳入地址,直接改變e變數,即回傳改變的e和堆疊S,及是否出堆疊成功
bool Pop(SqStack* S, SElemType* e);
//輸出迷宮
bool PrintfMaze(MazeType* M);
//輸出迷宮的路徑
bool PrintfFoot(MazeType* M, SqStack* S);
//將迷宮的當前位置Pos設定為“走過”,即footprint該位置為1
bool FootPrint(MazeType* M, PosType pos);
//判斷當前位置是否走過
bool Pass(MazeType* M, PosType pos);
//創建新的節點,用step,pos,d初始化該點
SElemType NewSElemType(int step, PosType pos, int d);
//將位置pos的方向設為d
PosType NextPos(PosType pos, int d);
//若迷宮maze中存在從入口start到出口end的通道,則求得一條存放在堆疊中(從堆疊底到堆疊頂)
bool MazePath(SqStack* S, MazeType maze, PosType start, PosType end);


//清空堆疊
bool ClearStack(SqStack* S);
//從堆疊底到堆疊頂依次對每個元素進行訪問
bool StackTravel(const SqStack* S);
//回傳堆疊的長度,即S元素的個數
int StackLength(SqStack S);
//若堆疊不為空,則用e回傳S的堆疊頂元素
bool GetTop(SqStack S, SElemType* e);


#endif 

2、maze.c

#include "maze.h"

//構造一個空堆疊
bool InitStack(SqStack* S)
{
	//100*SElemType
	S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));	
	if(!S->base)
	{	
		printf("申請空間失敗,迷宮無法初始化.\n");
		return false;
	}

	S->top = S->base;
	S->stacksize = STACK_INIT_SIZE;
	return true;
}

//初始化迷宮資料
bool InitMaze(MazeType* M)
{
	char mz[ROW][COLUMN]={	
	{'#',' ','#','#','#','#','#','#','#','#'},
	{'#',' ',' ','#',' ',' ',' ','#',' ','#'},
	{'#',' ',' ','#',' ',' ',' ','#',' ','#'},
	{'#',' ',' ',' ',' ','#','#',' ',' ','#'},
	{'#',' ','#','#','#',' ',' ',' ',' ','#'},
	{'#',' ',' ',' ','#',' ','#',' ','#','#'},
	{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
	{'#',' ','#','#','#',' ','#','#',' ','#'},
	{'#','#',' ',' ',' ',' ',' ',' ',' ',' '},
	{'#','#','#','#','#','#','#','#','#','#'},
	};

	M->maze = (char **)malloc(sizeof(char*)*ROW);		//相當于分配一維陣列空間,10個char*變數空間
	M->footprint = (int **)malloc(sizeof(int*)*ROW);	//相當于分配一維陣列空間,10個int*變數空間
	
	if(!M->maze || !M->footprint)
	{
		printf("申請空間失敗,迷宮無法初始化.\n");
		return false;
	}

	for(int i = 0; i < ROW; i++)
	{
		M->maze[i]=(char*)malloc(sizeof(char)*COLUMN);		//相當于分配二維陣列空間,每個個char*指向,10個char大小變數空間
		M->footprint[i]=(int*)malloc(sizeof(int)*COLUMN);	//相當于分配二維陣列空間,每個個int*指向,10個int大小變數空間
		if(!M->maze[i] || !M->footprint[i])
		{
			printf("申請空間失敗,迷宮無法初始化.\n");
			return false;
		}
	}
	for(int i = 0; i <ROW; i++)
	{
		for(int j = 0; j < COLUMN; j++)
		{
			M->maze[i][j] = mz[i][j];
			M->footprint[i][j] = 0;
		}
	}
	M->row = ROW;
	M->column = COLUMN;
	return true;
}

//判斷是否為空賬
bool IsStackEmpty(SqStack S)
{
	if(S.top == S.base)
		return true;
	else
		return false;
}

//入堆疊,元素e為新的堆疊頂元素,傳入e形參拷貝值,回傳改變的堆疊S,及是否入堆疊成功
bool Push(SqStack* S, SElemType e)
{
	//結構體型別,按單位大小相減類比int型,每個int型為4byte,相減2-1也是按斯單位相減
	if(S->top - S->base >= S->stacksize)	//如果超出本來的長度,進行動態的添加,每一次添加10個SElemType大小空間,STACKINCREMENT=10
	{
		S->base = (SElemType*)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(SElemType));
		if(!S->base);
		{
			printf("重新申請空間失敗.\n");
			return false;
		}
		S->top = S->base + S->stacksize;	//堆疊頂指標指向原先堆疊的尾部,堆疊底+堆疊長度
		S->stacksize +=STACKINCREMENT;		//堆疊的長度+10
	}
	*S->top++=e;	//堆疊頂指標+1前進,并且e賦值給解參考的指標,入堆疊
	//后置++/--為第一優先級,*和前置++/--為第二優先級
	return true;
}

//出堆疊,指標傳入地址,直接改變e變數,即回傳改變的e和堆疊S,及是否出堆疊成功
bool Pop(SqStack* S, SElemType* e)
{
	if(S->top == S->base)
	{
		printf("堆疊為空.\n");
		return false;
	}
	*e = *(--S->top);	//堆疊頂指標-1回傳,并且解參考賦值給e
	return true;
}

//輸出迷宮
bool PrintfMaze(MazeType* M)
{
	printf("%s","xy");
	for(int i=0;i<M->column;i++)
	{
		printf("%d",i);
	}
	printf("\n");
	
	for(int i=0; i<M->row; i++)
	{
		printf("%d ",i);
		for(int j=0; j<M->column; j++)
		{
			printf("%c",M->maze[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	
	//footprintf
	printf("%s","xy");
	for(int i=0;i<M->column;i++)
	{
		printf("%d",i);
	}
	printf("\n");
	for(int i=0; i<M->row; i++)
	{
		printf("%d ",i);
		for(int j=0; j<M->column; j++)
		{
			printf("%d",M->footprint[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	return true;
}

//輸出迷宮路徑
bool PrintfFoot(MazeType* M, SqStack* S)
{
	SElemType* p;
	for(int i=0; i<M->row; i++)		//將footprint置0
	{
		for(int j=0; j<M->column; j++)
		{
			M->footprint[i][j]=0;
		}
	}

	p = S->base;
	if(S->base == S->top)
	{
		printf("堆疊為空.\n");
		return false;
	}
	while(p != S->top)	//根據堆疊中存有的節點的坐標,對footprint進行1路徑賦值
	{
		M->footprint[p->seat.x][p->seat.y] = 1;
		*p++;
	}
	for(int i=0; i<M->row; i++)	//輸出路徑
	{
		for(int j=0; j<M->column; j++)
		{
			printf("%d",M->footprint[i][j]);
		}
		printf("\n");
	}
	return true;
}

//將迷宮的當前位置Pos設定為“走過”,即footprint該位置為1
bool FootPrint(MazeType* M, PosType pos)	//FootPrint足跡
{
	if((pos.x>M->row) || (pos.y>M->column))	
	{
		printf("坐標越界.\n");
		return false;
	}
	M->footprint[pos.x][pos.y]=1;
	return true;
}

//判斷當前位置是否走過
bool Pass(MazeType* M, PosType pos)
{
	if((pos.x > M->row) || (pos.y > M->column))	
	{
		printf("坐標越界.\n");
		return false;
	}
	
	if((0 == M->footprint[pos.x][pos.y])&&(M->maze[pos.x][pos.y]==' '))
		return true;	//通路沒走過
	else
		return false;	//通路走過或者墻
}

//創建新的節點,用step,pos,d初始化該點
SElemType NewSElemType(int step, PosType pos, int d)
{
	SElemType e;
	e.ord = step;
	e.seat = pos;
	e.di = d;
	return e;

}

//將位置pos的方向設為d
PosType NextPos(PosType pos, int d)
{
	switch(d)
	{
		case 1:	//向下
			pos.x++;
			break;
		case 2: //向右
			pos.y++;
			break;
		case 3: //向上
			pos.x--;
			break;
		case 4: //向左
			pos.y--;
			break;
		default:
			printf("error.\n");
	}
	return pos;
}

//若迷宮maze中存在從入口start到出口end的通道,則求得一條存放在堆疊中(從堆疊底到堆疊頂)
bool MazePath(SqStack* S, MazeType maze, PosType start, PosType end)
{
	int curstep = 1;
	SElemType e;
	PosType curpos = start;
	InitStack(S);
	do
	{
		if(true == Pass(&maze, curpos)) //通路沒走過
		{
			FootPrint(&maze,curpos);將當前點標記為走過
			e=NewSElemType(curstep,curpos,1);//創建堆疊元素,將當前點的資訊存盤,便于出入堆疊及改變當前點的di資訊
			Push(S,e);
			if((curpos.x==end.x)&&(curpos.y==end.y))//終點
			{
				printf("迷宮路徑:\n");
				PrintfFoot(&maze,S);//列印通路路徑
				return true;
			}
			curpos = NextPos(curpos,1);//向當前點的di方向偏移 ,即下一個點
			curstep++;//步數+1
		}
		else //通路走過或者墻
		{
			if(!IsStackEmpty(*S))
			{
				Pop(S,&e);
				while(e.di==4 && !IsStackEmpty(*S)) //四個方向遍歷完,說明此點不是正確道路,,且且堆疊不為空,就一直出堆疊
				{
					Pop(S,&e);
				}
				if(e.di<4)
				{
					e.di++;//改變當前點的di,偏移方向
					Push(S,e);//將改變了di的當前點資訊,入堆疊
					curpos=NextPos(e.seat,e.di);//向當前點的di方向偏移
				}
			}
		}
	}while(!IsStackEmpty(*S));
	
	return false;
}

//清空堆疊
bool ClearStack(SqStack* S)
{
	//把堆疊S置為空堆疊
	if(!S) return false;
	S->top = S->base;
	return true;
}

//從堆疊底到堆疊頂依次對每個元素進行訪問
bool StackTravel(const SqStack* S)
{
	SElemType* p = S->base;
	if(S->base == S->top)
	{
		printf("堆疊為空.\n");
		return false;
	}
	printf("堆疊中元素:\n");
	while(p != S->top)
	{
		printf("x=%d,y=%d\n",p->seat.x,p->seat.y);
		*p++;
	}
	printf("\n");
	return true;
}

//回傳堆疊的長度,即S元素的個數
int StackLength(SqStack S)
{
	return S.stacksize;
}

//若堆疊不為空,則用e回傳S的堆疊頂元素
bool GetTop(SqStack S, SElemType* e)
{
	if(S.top == S.base)
	{
		printf("堆疊為空.\n");
		return false;
	}
	else
	{
		*e = *(S.top - 1);
		//printf("堆疊頂元素:%c\n",*e);
		return true;
	}
}

3、maze.c

#include "maze.h"
int main()
{
	MazeType maze;
	SqStack *stack =(SqStack *)malloc(sizeof(SqStack));
	PosType start,end;
	start.x = 1;
	start.y = 6;
	end.x = 8;
	end.y = 9;

	InitMaze(&maze);
	
	printf("maze:\n");
	PrintfMaze(&maze);

	if(true == MazePath(stack,maze,start,end))
		printf("maze can out.\n");
	else
		printf("maze can not out.\n");
		
	StackTravel(stack);
	printf("堆疊的長度:%d\n",StackLength(*stack));
	
	SElemType ele;
	GetTop(*stack,&ele);
	printf("堆疊頂元素:ord=%d,x=%d,y=%d,di=%d\n",ele.ord,ele.seat.x,ele.seat.y,ele.di);

	ClearStack(stack);
	GetTop(*stack,&ele);
	
	//銷毀堆疊——銷毀free空間,需要在同一個記憶體空間銷毀
	free(stack);
	stack=NULL;
	
	return 0;
}

六,效果展示

此測驗起點(1,6),終點(8,9)

在這里插入圖片描述

相信大家看到這個結果是會有疑問的,因為雖然得到一條正確的迷宮路徑,但卻不是最優解,這是為什么呢?

依舊存在缺陷的迷宮演算法,無法獲得最優路徑解,因為遍歷的方向固定,所以大家有什么辦法可以優化它呢?

如有不足之處,還望指正 1


  1. 如果對您有幫助可以點贊、收藏、關注,將會是我最大的動力 ??

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/236637.html

標籤:其他

上一篇:Spring擴展點探索之BeanFactoryPostProcessor

下一篇:【快速排序】—— [USACO07DEC]Bookshelf B

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more